我不想让权限控制权权局限于访问某个页面,而想对页面类中的方法也进行控制。如:页面A中有两个按钮,一个是"添加",一个个是"删除",我想让不同的用户分别具有添加或者删除的权限。但我不想在两个方法(如:btnAdd_onClick, btnDelete_onClick)方法中进行判断。而想统一的先判断用户将要调用哪个方法,再判断他是否具有调用那个方法的权限,如果有则继续执行(调用那个方法),如果没有则中止。

解决方案 »

  1.   

    我现在还想知道的就是,ASP.NET 应用程序是如何依据用户所发送到服务器端的信息去判断执行部份程序的。
      

  2.   

    用户登陆后用户信息可以放到Session或者Cookie中
    一个Button就可以了啊
    如:
    private void btnSubmit_Click(object sender, System.EventArgs e)
    {
        if (Session["UserPower"] == null)
            return;
        string strUserPower = Session["UserPower"].ToString();
        switch(strUserPower)
        {
            case "Add":
                this.Add();
                break;
            case "Del":
                this.Del();
                break;
            default:
                break;
        }
    }
      

  3.   

    Q: 我现在还想知道的就是,ASP.NET 应用程序是如何依据用户所发送到服务器端的信息去判断执行部份程序的。
    ————————————————————————————————————————————
    A: asp.net2.0现在有两种方式——postback方式、callback方式。以前只有postback方式。在asp.net2.0 中 treeview、gridView都有利用客户端回调做到的所谓“无刷新”功能,但是总的来说callback由于是新出来的,使用它的控件还很少。所有需要接收客户端提交的值并且触发形如xxxChanged事件的控件都要实现IPostbackDatahandler接口,所有响应客户端回发事件的控件都要实现IPostBackEventHandler接口。你从浏览器察看网页的客户端源代码,可以看到很多 __doPostback('xxx$yyy','arg') 样子的代码。这个__doPostback 脚本函数实际上执行 form.submit 方法,也就是提交窗体中的值(使用http的POST指令)到服务器(并且下载结果html进行显示)。提交式,把隐藏字段 __ViewState等几个关键的字段也一并提交。其中,包括xxx$yyy和后边的参数作为提交的值。服务器端,首先将__ViewState隐藏域中的值填入各个控件,之后页面调用多有实现了IPostbackDataHandler接口的控件使用这个接口中的一个函数(好像是LoadPostData方法)传递给它客户端的最新提交的值,并且它返回的bool值表示是否需要下一步要触发xxxxChanged类型的事件。page_load事件执行完毕之后(对于2.0就是page_loadcomplete事件执行完毕之后),会把在这个事件中动态创建的控件的ViewState、Post值填入。然后,触发上面已经保存好的所有xxxxChanged类型的事件。之后会查找xxx$yyy所对应的控件(根据这个控件的UniqueName属性),如果没有找到就放弃了,如果找到了就调用这个控件的IPostBackEventhandler中的方法(arg是参数),每个控件内部会在处理这个raisePostBackEvent方法的内部去触发自己的事件,例如按钮的Click、Calendar的VisibleMonthChanged和SelectionChanged、MenuItem的 MenuItemClick 等事件。
      

  4.   

    我不太明白你打算如何“自动化地”产生界面。如果是自动化地产生的,那么是否产生相应的ui界面(无权限就不用产生ui给它)以及那些事件的处理代码(由ui控件的事件自动调用业务对象的method)都是由产生界面的程序自动完成的,也就是说完全是根据业务对象上的说明(反射)动态装载相应的控件和设置属性。
      

  5.   

    方法一:
    在用户登录页面的时候,对他的权限进行判断,然后根据权限屏蔽一些Button或者textbox,让用户无法使用。方法二:
    将方法分类保存在不同的目录,进行权限管理。方法三:
    在用户触发事件后,对其权限进行判断,如果有权限,继续执行,如果没有权限,弹出错误信息,同时中止操作
      

  6.   

    我不太明白你打算如何“自动化地”产生界面。如果是自动化地产生的,那么是否产生相应的ui界面(无权限就不用产生ui给它)以及那些事件的处理代码(由ui控件的事件自动调用业务对象的method)都是由产生界面的程序自动完成的,也就是说完全是根据业务对象上的说明(反射)动态装载相应的控件和设置属性。
    ======================================================================================
    首先非常感谢您的回答,我现在还没有想要做到自动化地控制页面,我目前所想实现的功能就是:
    1.页面呈现所有的控件
    2.用户使用控件,触发相应的事件
    3.程序解释用户所调用的方法(如:WebForm1.btnAdd_Click),如果其具有该权限,则执行否则中断执行,并提示无此权限。我目前的困扰就在第三步。程序应该如何去判断用户将会执行哪部份程序(比如在Page_Load中判断)。例如:有页面 WebForm1,其中有两个按钮 btnAdd 及 btnDel ,现在用户点击 btnAdd 按钮,页面 PostBack。当然啦在程序进入 WebForm1.btnAdd_Click 之前会先进入 WebForm1.Page_Load,我现在就是要在 Page_Load 里面去判断程序将会执行 WebForm1.btnAdd_Click 还是 WebForm1.btnDel_Click。当然啦,不仅仅局限于 Page_Load 如果能在更低层判断就更好了(如 Application_BeginRequest 中)。还有一点就是肯定不能在 WebForm1.btnAdd_Click 等等之类的方法里面去判断,那样就没有任何意义了。
      

  7.   

    我的做法是:
    建立一个权限处理类,数据格式为Hashtable,Key是类名_方法名,value为1 or 0
    登录时,把所有的权限放到一个Hashtable里,执行一个方法前,第一句判断是否有此类此方法的权限.
      

  8.   

    Q: 我目前的困扰就在第三步。程序应该如何去判断用户将会执行哪部份程序(比如在Page_Load中判断)。
    ——————————————————————————————————————————
    A: 其实我的疑问是:你又是如何去写程序的呢?原来你写程序的时候并不考虑动态装载控件问题。
      

  9.   

    我的做法是:
    建立一个权限处理类,数据格式为Hashtable,Key是类名_方法名,value为1 or 0
    登录时,把所有的权限放到一个Hashtable里,执行一个方法前,第一句判断是否有此类此方法的权限.
    =================================================================================
    我现在的想法就是不想在每个方法里面都加上判断的语句。在执行所有方法前判断用户是否有执行该方法的权限。这样可以集中的管理。因为一旦程序的身份验证策略有变,那么你不得不更改每一处代码。我现在想做的就是想封装用户身份验证策略。程序的类/方法中只需加入该类/方法的 Attribute 以给该类/方法更友好的命名及说明,如:[Power(Name="Car", Desc="车辆管理")]
    public class Car
    {
        public void Item() {}    [Power(Name="Car.Add", Desc="添加车辆")]
        public bool Add() {...}    [Power(Name="Car.Del", Desc="删除车辆")]
        public bool Del() {...}
    }然后用反射判断要调用的方法的 Power.Name 是否在权限列表中,如果存在则执行,如果不存在则中止。
      

  10.   

    .NET内置的几种顶多也就能精确到页面级.要更精确到方法,除了在每个方法前,加判断外,我想不到更好的办法.
    这样做弹性也很大啊.权限类里,控制着所有页面和方法权限.而某个用户的权限则存在用户数据表里,登录时,取出权限,分配到Hashtable里.
    不过如果要改Hashtable中权限位置的话,还是比较麻烦.毕竟这样的情况不多
      

  11.   

    我之所以有这样的想法就是想控制 对象/记录 的查询、添加、修改、删除 等操作。但我又不想将对 对象/记录 的那些操作分别写到不同的页面中(例如:Item_Add.aspx、Item_Del.aspx...)。
      

  12.   

    在页面load方法里根据权限屏蔽掉一些按钮,就可以...
      

  13.   

    你可以看看AOP,用aspect#看看,实现一种动态职入
      

  14.   

    在整个系统的用户,角色,权限设计上可能比较棘手。其他应该不会有设么问题
    可以为每个用户配置不同的角色,为每个角色配置权限,可以根据当前登陆用户从数据中获取该用户的权限结构,或部分权限结构
    没有权限的可以不让显示,<button style="display:<%=根据权限结构得到的值%>">删除</button>