Form验证角色问题

关于Form验证角色问题:

       一、问题描述:有两种用户,买方,卖方;在数据库中分别有两个用户表。要求:网站根目录下有两个目录假设为DW目录、GR目录。目录下都 有一个login.aspx文件,分别是dwlogin.aspx,grlogin.aspx,登录时分别用自己的login.aspx文件,登录后不能访问对方的目录。      

  二、总体思路:创建自定义的身份验证票据,将roles信息放在票据的userData中.        

三、设置Web.config    

<configuration>  

  <system.web>  

  <authentication   mode="Forms">  

  <forms   name=".ASPXAUTH"     loginUrl="login.aspx"//根目录中的,就是下面的第六条     protection="All"     path="/"/>    

 </authentication>                

 </system.web>    

<location   path="DW">    

<system.web>    

 <authorization>    

<allow   roles="DW"/>    

<deny   users="*"   />//这里必须用*,用?达不到要求    

</authorization>    

</system.web>    

</location>    

<location   path="GR">    

<system.web>    

<authorization>    

<allow   roles="GR"/>    

 <deny   users="*"   />    

</authorization>    

</system.web>    

</location>    

<location   path="/DW/DWLogin.aspx">  

  <system.web>    

 <authorization>    

 <allow   users="*"   />    

</authorization>    

</system.web>    

 </location>    

 <location   path="GR/GRLogin.aspx">    

<system.web>    

<authorization>    

 <allow   users="*"   />    

</authorization>    

</system.web>    

</location>    

四、DWLogin.aspx中        

 private   void   Button1_Click(object   sender,   System.EventArgs   e)    

 {     HttpCookie   objCookie;     string     strReturnURL;    

 if   (IsValid)    

  {     switch   (GetUser(   Username.Text,Password.Text))//   GetUser函数得到用户名和密码,正确返回0,密码错返回2   ,用户名错返回1    

 {     case   0:     FormsAuthenticationTicket   ticket   =   new   FormsAuthenticationTicket(     1,   Username.Text,       DateTime.Now,       DateTime.Now.AddMinutes(30),       false,       "DW");//我是直接写进去的,可能还有更好的方法    

objCookie   =   new   HttpCookie(   =(".ASPXAUTH"   );    

objCookie.Value   =   FormsAuthentication.Encrypt(   ticket   );    

Response.Cookies.Add(   objCookie   );    

strReturnURL   =   Request.Params[   "ReturnURL"   ];    

if   (   strReturnURL   !=   null   )      

{     Response.Redirect(   strReturnURL   );//返回到原来访问的页面     }      

 else      

 {     Response.Redirect(   "Default.aspx"   );//这里也可以设置你想设置的页面     }    

break;     case   1:     this.Page.RegisterStartupScript("Info","<script>alert('该用户不存在!!');</script>");     break;     case   2:     this.Page.RegisterStartupScript("Info","<script>alert('密码错误!!');</script>");    

break;    

}     }     }        

个人的登录页面GRLogin.aspx中写法同上面                

五、Global.asax中添加如下代码:        

 protected   void   Application_AuthenticateRequest(Object   sender,   EventArgs   e)    

{    

 if   (HttpContext.Current.User   !=   null)    

{    

 if   (HttpContext.Current.User.Identity.IsAuthenticated)    

{    

 if   (HttpContext.Current.User.Identity   is   FormsIdentity)  

  {    

FormsIdentity   id   =(FormsIdentity)HttpContext.Current.User.Identity;  

 FormsAuthenticationTicket   ticket   =   id.Ticket;     string   userData   =   ticket.UserData;    

string[]   roles   =   userData.Split(',');    

HttpContext.Current.User   =   new   GenericPrincipal(id,   roles);    

 }     }     }     }        

 六、根目录下建login.aspx,其中添加如下代码:(这个login.aspx没有用户名和密码输入框,主要是用来重定位各自的登录页面)        

 private   void   Page_Load(object   sender,   System.EventArgs   e)    

{    

string   ParamName   =   "ReturnUrl";    

string   ReturnUrl   =   Request.QueryString[ParamName];    

if   (ReturnUrl.ToLower().IndexOf("DW")   >=0)    

{    

Response.Redirect("DW/DWLogin.aspx?"   +   ParamName     +   "="   +   ReturnUrl);    

}    

 else   if   (ReturnUrl.ToLower().IndexOf("GR")   >=0   )    

 {    

 Response.Redirect("GR/GRLogin.aspx?"   +   ParamName     +   "="   +   ReturnUrl);     }     else     {     //这里添加一些你的提示,指定页面也可以    

}    

}  

 

 

以下为引用:

构建基于forms的验证机制过程如下: 1,设置IIS为可匿名访问和asp.net web.config中设置为form验证 2,检索数据存储验证用户,并检索角色(如果不是基于角色可不用) 3,使用FormsAuthenticationTicket创建一个Cookie并回发到客户端,并存储   角色到票中,如:  

 FormsAuthentication.SetAuthCookie(Username,true | false)  

cookies保存时间:  

HttpContext.Current.Response.Cookies[FormsAuthentication.FormsCookieName].Expires=DateTime.Now.AddDays(1) 

  如果需要存储角色,采用: 

 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  

HttpCookie authCookie =   new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);

 Response.Cookies.Add(authCookie);

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

代码:  

HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName]; 

 FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);//解密 

 string[] roles = authTicket.UserData.Split(new char[]{';'});//根据存入时的格式分解,;或|....  

Context.User = new GenericPrincipal(Context.User.Identity, Roles);//存在HttpContext.User中

5,需要对某些页面进行角色控制,有两种方法:  

5.1,web.config中加    

<location path="EditPost.aspx">  

<system.web>  

 <authorization>                        

<allow roles="RoleName" />    

<deny users="?" />   

</authorization>  

</system.web>    

</location>  

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

 <configuration>     

<system.web>  

<authorization>           

<allow roles="RoleName" />    

<deny users="*" /> 

 </authorization>     

</system.web>   

</configuration>  

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

 

Trackback: http://tb.donews.net/TrackBack.aspx?PostId=338236

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值