zoukankan      html  css  js  c++  java
  • Asp.Net的基于Forms的验证机制角色授权

    项目需要研究了下Asp.Net的基于forms的验证机制 [smile]

      构建基于forms的验证机制过程如下:
        1,设置IIS为可匿名访问和asp.net web.config中设置为form验证
        2,检索数据存储验证用户,并检索角色(如果不是基于角色可不用)

        简单无role方式:

        使用FormsAuthenticationTicket创建一个Cookie并回发到客户端,并存储 角色到票中,如:
         FormsAuthentication.SetAuthCookie(Username,true | false)
        cookies保存时间:
        HttpContext.Current.Response.Cookies[FormsAuthentication.FormsCookieName].Expires=DateTime.Now.AddDays(1)

        如果需要存储角色方式:  

    1.  FormsAuthenticationTicket authTicket = new    
    2.  FormsAuthenticationTicket(    
    3.  1, // version    
    4.  txtUserName.Text, // user name    
    5.  DateTime.Now, // creation    
    6.  DateTime.Now.AddMinutes(20),// Expiration    
    7.  false// Persistent    
    8.  roles ); // User data   
    9.     //roles是一个角色字符串数组    
    10.  string encryptedTicket = FormsAuthentication.Encrypt(authTicket); //加密   

       存入Cookie

    1. HttpCookie authCookie =    
    2. new HttpCookie(FormsAuthentication.FormsCookieName,    
    3. encryptedTicket);    
    4.   
    5. Response.Cookies.Add(authCookie);   

       在Application_AuthenticateRequest事件中处理程序中(Global.asax)中,使用票创建IPrincipal对象并存在HttpContext.User中代码:

    1. protected void Application_AuthorizeRequest(object sender, System.EventArgs e)   
    2. {   
    3.  HttpApplication App = (HttpApplication) sender;   
    4.  HttpContext Ctx = App.Context ; //获取本次Http请求相关的HttpContext对象   
    5.  if (Ctx.Request.IsAuthenticated == true//验证过的用户才进行role的处理   
    6.  {   
    7.  FormsIdentity Id = (FormsIdentity)Ctx.User.Identity ;   
    8.  FormsAuthenticationTicket Ticket = Id.Ticket ; //取得身份验证票   
    9.  string[] Roles = Ticket.UserData.Split (',') ; //将身份验证票中的role数据转成字符串数组   
    10.  Ctx.User = new GenericPrincipal (Id, Roles) ; //将原有的Identity加上角色信息新建一个GenericPrincipal表示当前用户,这样当前用户就拥有了role信息   
    11.  }   
    12. }  

       需要对某些页面进行角色控制,有两种方法:
        1、web.config中加

    1. <location path="EditPost.aspx">    
    2. <system.web>    
    3. <authorization>    
    4. <allow roles="RoleName" />    
    5. <deny users="?" />    
    6. </authorization>    
    7. </system.web>    
    8. </location>   

        2、把只能是某种角色访问的文件放在同一目录下,在此目录下添加一个web.config

    1. <configuration>    
    2. <system.web>    
    3. <authorization>    
    4. <allow roles="RoleName" />    
    5. <deny users="*" />    
    6. </authorization>    
    7. </system.web>    
    8. </configuration>   

        说明:子目录的web.config设置优先于父目录的web.config设置



    Forms身份验证,为什么<allow roles="Administrators" /><deny users="*" />后,所有用户都进不来了?

    把把授权的代码放到Application_AuthorizeRequest里面是不对的!由于很多相关文章都是引用的,故害死很好程序员,应该是放在下面这个事件里的。

    void Application_PostAuthenticateRequest(Object sender, EventArgs e)
        {
            HttpApplication App = (HttpApplication)sender;
            HttpContext Ctx = App.Context; //获取本次Http请求相关的HttpContext对象
            if (Ctx.Request.IsAuthenticated) //验证过的用户才进行role的处理
            {
                FormsIdentity Id = Ctx.User.Identity as FormsIdentity;
                FormsAuthenticationTicket Ticket = Id.Ticket; //取得身份验证票
                string[] Roles = Ticket.UserData.Split(','); //将身份验证票中的role数据转成字符串数组
                Ctx.User = new System.Security.Principal.GenericPrincipal(Id, Roles); //将原有的Identity加上角色信息新建一个GenericPrincipal表示当前用户,这样当前用户就拥有了role信息
            }
        }


    具体请参考:http://community.csdn.net/Expert/TopicView3.asp?id=5526963

  • 相关阅读:
    可持续化线段树(主席树)
    2016-06-19 NOIP模拟赛
    0618图的整理
    1536 海战
    1005 生日礼物
    3280 easyfinding
    2594 解药还是毒药
    2919 选择题
    1845 二叉查找树
    1174 靶形数独
  • 原文地址:https://www.cnblogs.com/laron/p/868067.html
Copyright © 2011-2022 走看看