有谁知道在ASP.net中实现这样的安全模块:应用中的URL或资源
有多个操作过程,比如查看,创建,更新,删除。如果可以在操作上
(而不是在资源上)控制用户的访问,这样就很有用。可以使asp.net
页面可以为相关的用户得到操作清单,实现权限控制。我已经通过实现Ihttpmodule接口实现了用户的验证。现在,想可以一步
完善这个安全模块,望各位可以一起提建议或交流
我指login 成功以后,进入一个asp.net的页面,比如http://mysite/test.asp.net(webform),里面有3按钮bt_add,bt_update,bt_check,根据登陆用户的权限不同,如经理有这3个按纽的全部执行权限,而开单人员只有bt_add,bt_update的功能,不可以执行bt_check按纽。我想实现的功能呢,就是构建一个安全模块:
1:可以取得各个页面中的按纽的name,text,按纽所在的页面(webform)的name放在database里面。2:给每个role或user,根据user权限级别高低,设置页面(webform)里面按纽可否执行,这些信息就存在database中3:应用执行时,已通过验证的user,根据usid从database取出对各个页面(webform)的按扭(操作)清单,放在全局缓存中。用户在页面对按扭执行时,就根据全局缓存中的操作清单,判断该用户对该按扭是否有权限执行。
这样就实现了对按扭,也就是实现了操作上的授权安全。4:如果可能的话,对httpapplication对象处理 AuthorizeRequest 事件应用程序级 (global.asax) 或者Http Module (实现 IHttpModule),实现第3步中的“就根据全局缓存中的操作清单,判断该用户对该按扭是否有权限执行。”
以上,就是我要实现的自定制Web授权。第1步和第3步是困难所在,望楼上的

解决方案 »

  1.   

    每个用户有不同的权限用户登陆之后,按用户的权限,分配给它不同的权限(这就需要Form验证了)进行操作的时候,判定这个用户是否有这个权限,有,操作,没有,返回根本不需要IHttpModule,只要懂FORM验证就行了
      

  2.   

    根本就是很简单的,只要将每个人对应的菜单权限放入数据库,进入系统的时候检索相应权限,自动生成操作列表,不就okay了?
    我们公司开发的电力系统就是这样做的,每个人的可操作权限都不同,还有权限组,管理也方便。
      

  3.   

    同意楼上的,我们也是这样做的,不过我们是C/S结构,在B/S下也应该可以实现吧
      

  4.   

    不用每个页面加代码啊,.net继承啊,非常的easy.
      

  5.   

    不用每个页面加代码啊,.net继承啊,非常的easy.
    怎么.net继承啊
    用ihttpmodule技术,我写了一个控制类,这个类继承this.system.web.ui.page,然后用this.page.findcontrol找控件,找不到,就是这样失败了
      

  6.   

    this.page.findcontrol怎么会找不到控件,你可以用控件唯一的ID来找啊?用过多次,从未失败。把你代码贴出来看看?
      

  7.   

    难吗?我的Workflow就是这样做的...
      

  8.   

    在Ihttpmodule类中是这样的
    这样调用
    public class HttpModuleApp:IHttpModule
    {
    HttpApplication app;
    DateTime dtstart=DateTime.Now; public HttpModuleApp()
    {

    }
    HttpContext Context
    {
    get 
    {
    return app.Context;
    }
    }
    public void Init(HttpApplication application)
    {
    if(app!=null) throw(new InvalidOperationException());
    app=application;
    application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
    application.AuthenticateRequest += (new EventHandler(this.Application_AuthenticateRequest));
    app.Error+=new EventHandler(app_Error);
    }private void Application_AuthenticateRequest(object sender,EventArgs e)
    {//控制类  HttpContext Context = HttpContext.Current;
    userchecher dd=new userchecher()
    //调用这个控制函数
    dd.checher(); }
    控制类:
    public  class RoleRightPropertyControl:System.Web.UI.Page
    {
    //实现权限的函数
    /// <summary>
    /// 
    /// </summary>
    /// <param name="e"></param>

    /// <summary>
    /// 控制用户功能是否能用
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>

    private void checher()
    {
    HttpContext Context = HttpContext.Current;
    DataSet ds=new DataSet();
    if((DataSet)Context.Items["dtGetRigthRoles"]==null)
    {
    RoleRightPropertyControl.GetRoleRightProperty();
    }
    ds=(DataSet)Context.Items["dtGetRigthRoles"];
    string sfuntionID="";
    int y=ds.Tables[0].Rows.Count;
    for (int x=0;x<y;x++)
    {
    if((Convert.ToInt32(ds.Tables[0].Rows[x][0]))==sfuntionID)
    {
    int j=ds.Tables[0].Columns.Count;
    for(int i=3;i<j;i++)
    {
    string functionstr=(ds.Tables[0].Columns[i].ToString()).Trim();
    System.Web.UI.WebControls.Button  functionControl =(System.Web.UI.WebControls.Button)this.Page.FindControl(functionstr);
    if(functionControl!=null)
    {
    if((Convert.ToBoolean(ds.Tables[0].Rows[x][i]))==true)
    {
    functionControl.Enabled=true;
    }
    else 
    {
    functionControl.Enabled=false;
    }
    }
    }
    }
    }
    }
      

  9.   

    给你点提示 利用 组件 + Session + HttpModule 可以编写出一套完整的权限控制体系,而且不用在每个页面编写代码。
      

  10.   

    >>给你点提示 利用 组件 + Session + HttpModule 可以编写出一套完整的权限控制体系,而且不用在每个页面编写代码。
    对httpModule不熟,盼望leiMZ说明一下,不要吊我们胃口 :p
      

  11.   

    :给每个role或user,根据user权限级别高低,设置页面(webform)里面按纽可否执行,这些信息就存在database中
    这个是应该  其他好象就不对了
      

  12.   

    给你点提示 利用 组件 + Session + HttpModule 可以编写出一套完整的权限控制体系,而且不用在每个页面编写代码。
    LeiMZ(神仙) 
    我的水平比较低吧,能否提供点伪代码吗?
    我这个问题已经好久了都不能解决啊,
    leiMZ说明一下
    能说明更详细的吗?
      

  13.   

    coolksj(coolksj)
     朋友,能否提供你的伪代码给我参考?我在这里多thanks了,
    如果有更好的代码,应该是比较好的,但我现在用另外的一种方法了,就是用两个实现Iprincipal和Iidentity的类
    但用ihttpmodule我真的没有办法了,但我想写一个页面的基类,每一个页面都继承这个基类,这样我是可以实现了,但我总不想都在这个页面都继承,能否可以自动继承吗
      

  14.   

    你这样做,就需要为每一个页面每一个需要权限验证的Control在数据库添加若干条记录以规定权限,对吗?首先我想知道你这些权限设置哪些是可以“前期绑定”的,哪些是“后期绑定”的。
    如果是前期绑定——也就是只有设计时需要修改而运行时不需要动态须改,那么使用类继承是个很好的方法。整页验证当然继承Page类啦,而你是针对某一个WebControl验证那就继承你需要验证功能的WebControl,非PostBack的时候该WebControl验证权限并确定自己是否可见,当PostBack的时候该WebControl验证是否足够权限来冒泡有关事件(或者进行有关操作)。这样做你可以在VS.NET的界面里面直接设置每一个控件的权限等级,设计时会方便很多。
    如果是后期绑定——用你的方法也行,不过好像比较麻烦,我还是建议你继承WebControl来做。你需要为每一个需要绑定的控件提供安全有关的数据。这个怎么说好呢,我的意思是你为WebControl提供一种类似数据绑定的方法,不过它不是绑定DataSet/DataTable等而是绑定你自己的一个/一些安全类,这些安全类提供安全校验结果。
      

  15.   

    cat_hsfz()
    WebControl这个设计方式是怎么样的呢?能否说详细点,不管是前期的还是后期的,只要能比较好的执行他们,也为了以后可以扩展他们,我的意思就是不要都在这一个页面都写代码这样好烦啊,扩展也不好啊,对吗?所以我现在唯一的方法就是写一个页面的基类,每一个页面都继承这个基类,这样扩展性也算比较好吧,对吗?但不我知道你的WebControl方法是否更好呢?好像你的WebControl方法是都在每一个页都添加这个webcontrol自定义控件吗
      

  16.   

    我利用ihttpmodule这个来,好像只能实现用户的验证,不能实现功能的验证,如果能的话,就提供点伪代码吧,好吗?朋友吗
      

  17.   

    我的意思最简单的表述方式就是,你继承WebControl做一个类包含一个SecuritySource的属性(反正就仿照DataSource的设计模式来做),然后控件在render以及处理postback的时候就通过这个属性来检测是否应该显示以及是否应该响应。至于SecuritySource的来源,你也可以仿照处理数据的方式做一个SecurityProvider,它是通过检测Session及数据库或者其它方式来校验权限都行啦,最重要的是能够表明当前的权限数据以供绑定的WebControl使用。如果你需要设计时支持,那么也可以仿照DataSource来创建一系列的设计时对话框,用来自动化添加/删除/修改该WebControl关联的权限。
      

  18.   

    我写了用C#单独编译成DLL可是就是不能用..就找不到啊..
    堆栈跟踪哪边显示找了好几个地方
      

  19.   

    我利用了:IIdentity和IPrincipal 接口,我实现了登录:
    登录代码为
    RightRoleCheckerPrincipal dd=new RightRoleCheckerPrincipal(txt_loginName.Text.Trim(),txt_password.Text.Trim()); if(dd.Identity.IsAuthenticated)
    {
    Context.User=dd;
    Response.Redirect("WebForm3.aspx");
    }
    else
    {Context.User=dd;
                      Response.Redirect("WebForm3.aspx"); }
    这个可以测试出Context.User.Identity.IsAuthenticated为true
    但我在另的类内,如
    using System;
    using System.Collections;
    using  System.Security.Principal;namespace Test
    {
    /// <summary>
    /// GGECPage 的摘要说明。
    /// </summary>
    public class GGECPage:System.Web.UI.Page
    {
    public GGECPage()
    {

    }
    protected override void OnInit(EventArgs e)
    { base.OnInit (e); this.Load +=new EventHandler(MyPage_Load);
    this.Error+=new EventHandler(PhilePage_Error); } //在页面加载的时候从缓存中提取用户信息
    private void MyPage_Load(object sender, System.EventArgs e) {

    if(Context.User.Identity.IsAuthenticated)
    {


    RightRoleCheckerPrincipal principal = new RightRoleCheckerPrincipal(userMessage["UserID"].ToString(),userMessage["UserPassword"].ToString());
    Context.User = principal;
    System.Web.UI.WebControls.Button  functionControl =(System.Web.UI.WebControls.Button)this.Page.FindControl("testbtn");
    if(functionControl!=null)
    {

    functionControl.Enabled=true;

    }
    System.Web.UI.WebControls.Button  functionControl1 =(System.Web.UI.WebControls.Button)this.Page.FindControl("testbtn2");
    if(functionControl1!=null)
    {

    functionControl1.Enabled=false;

    }
    } }
    }
    为什么在这里:Context.User.Identity.IsAuthenticated为false呢?
    哪一位高手能提示一下吗?
    配置文件添加了
    <identity impersonate="true" />
        <authentication mode="Forms">
      <forms loginUrl="WebForm1.aspx" name="AuthCookie" timeout="60" path="/">
      </forms>
    </authentication>    <authorization>
        <!--
         <deny users="?" />
         -->
            <allow users="*" /> 
        </authorization>为什么会这样呢?我真的的搞不懂啊
      

  20.   

    能否再利用ihttpmodule实现权限的验证呢?
      

  21.   

    为什么一定要ihttpmodule?
    身份令牌或者session就可以
      

  22.   

    通过ihttpmodule以后比较方便扩展,更改
      

  23.   

    to 小张
    你这样做是有问题的.确实.可以按你的思路可以实现操作上的权限控制.
    但是不应该是在 IHttpHander的层面上。因为在页面在执行这个这里的时候很多的控件都没有进行初始化。 还有你的认证机制在这个时候还没有发生。所有会出现 Context.User.Identity.IsAuthenticated = false的情况。因此应该是在page的类上继承。你可以这样写一个所有的页面继承自page 中比如 BasePage 如下代码:BasePage.aspx
    namespace WebApplication1
    {
    /// <summary>
    /// Class2 的摘要说明。
    /// </summary>
    public class BaseClass :System.Web.UI.Page
    {
    public BaseClass()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    this.Load+=new EventHandler(BaseClass_Load);
    } private void BaseClass_Load(object sender, EventArgs e)
    {
    LinkButton lb = (LinkButton)this.FindControl("LinkButton1");
    lb.Text = "p chengde";

    }
    }
    }
    文件 WebForm4.aspx
    namespace WebApplication1
    {
    /// <summary>
    /// WebForm4 的摘要说明。
    /// </summary>
    public class WebForm4 : BaseClass
    {
    public System.Web.UI.WebControls.LinkButton LinkButton1;

    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面

    } #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion
    }
    }页面执行后你会发现 在BasePage 类中已经更改了 LinkButton的值。如果满意就给分吧。呵呵。
      

  24.   

    以上的权限方式处理的粒度比较小了。对于权限粒度的更小的方法就没有办法用上述方法实现了 。比如。针对于一个查询。 有些用户只能查询小于一个值得记录。而有些用户可以查询全部数据。等等很复杂的权限策略。以上的模式应该属于AOP的模式了吧。就是在所有模块中横切一刀。集成权限处理。可插拔的解决方案。呵呵。不太懂。理解的比较浅显!。
      

  25.   

    也是差不多像aop的模式啊,只是表示方式不一样