none
IPrincipal,IIdentity如何实现角色身份认证 RRS feed

  • 问题

  • 请问IPrincipal,IIdentity这2个接口如何实现数据库中指定了IsAdmin的用户能访问Setting文件夹下的内容??
    请大家给个示例,网上找了很多资料都没有看明白!!
    I Belong To Jesus...
    2009年8月3日 7:24

答案

  • 您好,
    可以通过验证和授权两步来理解!

    1、关于验证部分,前两天刚好跟一位朋友讨论过。
    请参考:http://social.microsoft.com/Forums/zh-CN/295/thread/19c42801-f25c-408a-91f7-485a70cf5c58
    为了基于角色,还需要修改一下,请找到上面连接中所给的btn_Validate_Click方法,将其中的
    string roles = "";
    改为string roles = "Admins";
    btn_Validate_Click方法的目的是验证身份,因Http是非面向连接的协议,故为了保持身份,还需在Global.asax加入Application_AuthenticateRequest,也可以在上面的连接中找到,这里要特别注意以下几句:

                string[] roles = authTicket.UserData.Split(new char[] { '|' });//在这里会获取验证时录入的角色“Admins”
                //创建标识对象
                System.Security.Principal.IIdentity id = new FormsIdentity(authTicket);
                //创建安全主体
                System.Security.Principal.IPrincipal principal = new System.Security.Principal.GenericPrincipal(id, roles);
                // 添加到Http上下文中
                Context.User = principal;

    这几句是将安全主体加入Http的上下文中。这样在每一个受保护的页面中即可获取用户和角色。



    2009年8月3日 11:11
    版主
  • 2、关于授权。
    新建一个文件夹SalesOrder,并在该文件夹下创建一个web.config,配置如下:
    <configuration>
        <system.web>
          <authorization>
            <allow roles="Admins"/>
            <deny users="*"/>
          </authorization>
        </system.web>
    </configuration>

    其中的Admins就要求和验证时设定的角色相同。
    可以新建一个webform来测试。
    加入以下代码,判断当前用户是否属于Admins角色:
         protected void Page_Load(object sender, EventArgs e)
            {
                if (HttpContext.Current.User.Identity.IsAuthenticated)
                {
                    if (HttpContext.Current.User.IsInRole("Admins"))
                    {
                        this.ClientScript.RegisterClientScriptBlock(this.GetType(), "Authenticate Success", "alert('验证成功!')", true);
                    }
                }
            }
    2009年8月3日 11:17
    版主

全部回复

  • 您好,
    可以通过验证和授权两步来理解!

    1、关于验证部分,前两天刚好跟一位朋友讨论过。
    请参考:http://social.microsoft.com/Forums/zh-CN/295/thread/19c42801-f25c-408a-91f7-485a70cf5c58
    为了基于角色,还需要修改一下,请找到上面连接中所给的btn_Validate_Click方法,将其中的
    string roles = "";
    改为string roles = "Admins";
    btn_Validate_Click方法的目的是验证身份,因Http是非面向连接的协议,故为了保持身份,还需在Global.asax加入Application_AuthenticateRequest,也可以在上面的连接中找到,这里要特别注意以下几句:

                string[] roles = authTicket.UserData.Split(new char[] { '|' });//在这里会获取验证时录入的角色“Admins”
                //创建标识对象
                System.Security.Principal.IIdentity id = new FormsIdentity(authTicket);
                //创建安全主体
                System.Security.Principal.IPrincipal principal = new System.Security.Principal.GenericPrincipal(id, roles);
                // 添加到Http上下文中
                Context.User = principal;

    这几句是将安全主体加入Http的上下文中。这样在每一个受保护的页面中即可获取用户和角色。



    2009年8月3日 11:11
    版主
  • 2、关于授权。
    新建一个文件夹SalesOrder,并在该文件夹下创建一个web.config,配置如下:
    <configuration>
        <system.web>
          <authorization>
            <allow roles="Admins"/>
            <deny users="*"/>
          </authorization>
        </system.web>
    </configuration>

    其中的Admins就要求和验证时设定的角色相同。
    可以新建一个webform来测试。
    加入以下代码,判断当前用户是否属于Admins角色:
         protected void Page_Load(object sender, EventArgs e)
            {
                if (HttpContext.Current.User.Identity.IsAuthenticated)
                {
                    if (HttpContext.Current.User.IsInRole("Admins"))
                    {
                        this.ClientScript.RegisterClientScriptBlock(this.GetType(), "Authenticate Success", "alert('验证成功!')", true);
                    }
                }
            }
    2009年8月3日 11:17
    版主
  • 通过上面两步就对子文件夹设定了角色保护。
    为了实现动态只需要在第一步中修改
    string roles = "Admins";

    string roles = SomeMethod(); //某个从数据库中获取当前用户角色的方法

    如果与第二步授权中的web.config配置的角色名相等,则可以访问该文件夹,否则拒绝!

    希望能有所帮助!
    2009年8月3日 11:20
    版主