ibcadmin 发表于 2012-12-6 13:55:45

ASP.NET安全机制(四)基于角色的安全机制

上面几个小节主要介绍了利用web.config基于用户名的身份验证,在实际开发过程中,还经常遇到另外一种情况,例如:网站的后台管理页面只能够被允许管理员角色的用户才能访问,其他角色不能够访问。我们可以借助于<authentication>配置节,按照如下方式进行配置,现用<allow>配置节允许角色Admins管理员,在使用<deny>配置节拒绝所有用户,那么可以达到只允许管理员访问的目的。完成基于角色的身份验证,大致可以分三个部分:1. web.config部分,用户设置身份验证和权限控制。2. ASP.NET部分,用户添加身份验证票证。3. Global.asax部分,设置身份验证请求事件。
代码演示: 基于角色的身份验证web.config部分<configuration>
<system.web>
<authentication mode="Forms">
<forms name="myForm" loginUrl="UserLogin.aspx" timeout="10" defaultUrl="Main.aspx">
</forms>
</authentication>
<authorization>
<allow roles="Admins">
<deny users="?">
</authorization>
 </system.web>
</configuration>在C#代码中,添加身份验证票证的时候,将用户的角色信息添加到票证中,与<authorization>结合从而实现目标。 参考代码如下:代码演示: 基于角色的身份验证ASP.NET部分protected void btnLogin_Click(object sender, EventArgs e)
{
    string loginname = this.txtLoginName.Text;
    string loginpwd = this.txtLoginPwd.Text;

    if (loginname == "张三" && loginpwd == "123456")
    {
      //为了演示,将角色定义到变量中
      string role = "Admins";
      //创建票证对象
      FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
            1, loginname, DateTime.Now, DateTime.Now.AddMinutes(30), true, role);
      //对票证对象加密措施
      string hashticket = FormsAuthentication.Encrypt(ticket);
      //将票证添加到Cookie中
      HttpCookie usercookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashticket);
      Response.Cookies.Add(usercookie);
      //将页面重定向到指定URL
      Response.Redirect(FormsAuthentication.GetRedirectUrl(loginname,true));
    }
}代码演示: 基于角色的身份验证Global.asax部分<%@ Application Language="C#" %>
<script runat="server">
    protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
      HttpApplication app = (HttpApplication)sender;
      //获取本次Http请求的HttpContext对象
      HttpContext ctx = app.Context;   
      if (ctx.User != null)
      {
            //验证过的一般用户才能进行角色验证
            if (ctx.Request.IsAuthenticated == true)
            {
                //获得身份验证用户的标识
                System.Web.Security.FormsIdentity fi =
(System.Web.Security.FormsIdentity)ctx.User.Identity;
                //取得身份验证票
                System.Web.Security.FormsAuthenticationTicket ticket = fi.Ticket;
                //从UserData中恢复role信息
                string userData = ticket.UserData;
                //将角色数据转成字符串数组,得到相关的角色信息
                string[] roles = userData.Split(',');
                //这样当前用户就拥有角色信息了
                ctx.User = new System.Security.Principal.GenericPrincipal(fi, roles);
            }
      }
    }
</script>在上面代码中,通过Global.asax文件访问到HttpApplication的安全模块建立事件,通过身份验证用户的标识,获得身份验证的票证,并在票证中加入用户角色相关信息,结合web.config和ASP.NET达到基于角色身份验证的目的。
页: [1]
查看完整版本: ASP.NET安全机制(四)基于角色的安全机制