Asp.Net的基于Forms的验证机制--角色授权

构建基于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); //加密   
 FormsAuthenticationTicket authTicket = new
FormsAuthenticationTicket(
1, // version
txtUserName.Text, // user name
DateTime.Now, // creation
DateTime.Now.AddMinutes(20),// Expiration
false, // Persistent
roles ); // User data
    //roles是一个角色字符串数组
string encryptedTicket = FormsAuthentication.Encrypt(authTicket); //加密 

   存入Cookie

  1. HttpCookie authCookie =    
  2. new HttpCookie(FormsAuthentication.FormsCookieName,    
  3. encryptedTicket);    
  4.   
  5. Response.Cookies.Add(authCookie);   
 HttpCookie authCookie =
new HttpCookie(FormsAuthentication.FormsCookieName,
encryptedTicket);
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. }  
protected void PostAuthenticateRequest(Object sender, EventArgs e)
{ HttpApplication App = (HttpApplication) sender; HttpContext Ctx = App.Context ; //获取本次Http请求相关的HttpContext对象 if (Ctx.Request.IsAuthenticated == true) //验证过的用户才进行role的处理 { FormsIdentity Id = (FormsIdentity)Ctx.User.Identity ; FormsAuthenticationTicket Ticket = Id.Ticket ; //取得身份验证票 string[] Roles = Ticket.UserData.Split (',') ; //将身份验证票中的role数据转成字符串数组 Ctx.User = new GenericPrincipal (Id, Roles) ; //将原有的Identity加上角色信息新建一个GenericPrincipal表示当前用户,这样当前用户就拥有了role信息 } }

   需要对某些页面进行角色控制,有两种方法:
    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>   
 <location path="EditPost.aspx">
<system.web>
<authorization>
<allow roles="RoleName" />
<deny users="?" />
</authorization>
</system.web>
</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>   
 <configuration>
<system.web>
<authorization>
<allow roles="RoleName" />
<deny users="*" />
</authorization>
</system.web>
</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

转载于:https://www.cnblogs.com/raymond19840709/archive/2007/08/24/868243.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值