先说说Form身份验证思路:

假设用户要浏览需要权限的页面,此时,安全机制先启动,检查当前用户请求是否持有用户票据的Cookie

如此Cookie存在:解析Cookie中的票据信息,获得用户角色,创建用户标识

否则:认为用户无权浏览该页面,跳转至登入页面,登入成功后重定向到所请求页面^-^

 

解释下我的文件目录:

-> Admin文件(该文件目录下内容用户必登入且角色为"Admin"才可浏览)

              -> Admin.aspx

-> User.aspx(该文件只要登入可浏览)

-> Login.aspx(用户登入页面,未登入可浏览)

-> Global.asax

-> web.config

 

1.web.config文件

[xhtml] view plaincopy

  1. <configuration>  

  2.   

  3.   <!-- 配置目录"Admin"下的页面浏览权限 -->  

  4.   <location path="Admin">  

  5.     <system.web>  

  6.       <authorization>  

  7.         <!-- 拒绝匿名用户访问 -->  

  8.         <deny users="?" roles="User"/>  

  9.         <!--  

  10.             <allow roles="Admin"/>  

  11.             <deny users="?"/>  

  12.             原先这样配置但导致角色"User"也可以访问,不知为何?  

  13.         -->  

  14.       </authorization>  

  15.     </system.web>  

  16.   </location>  

  17.   

  18.     <system.web>  

  19.           <!--  

  20.             通过 <authentication> 节可以配置 ASP.NET 用来   

  21.             识别进入用户的  

  22.             安全身份验证模式。   

  23.         -->  

  24.      <authentication mode="Forms">  

  25.       <forms loginUrl="Login.aspx" defaultUrl="User.aspx" name=".LoginFormsTicket" path="/" timeout="40" protection="All">  

  26.         <credentials passwordFormat="Clear">  

  27.           <user name="lulu" password="66"/>  

  28.         </credentials>  

  29.       </forms>  

  30.     </authentication>  

  31.       

  32.     <!-- 配置网站页面浏览权限 -->  

  33.     <authorization>  

  34.       <!-- 拒绝:?(匿名用户) *(所有用户) -->  

  35.       <deny users="?"/>  

  36.     </authorization>  

  37.   

  38.     </system.web>  

  39. </configuration>  


再补充下对Forms身份验证配置文件各项的说明^^:

[c-sharp] view plaincopy

  1. /* 

  2. <forms>节点中的属性含义: 

  3. name:定义用于存储用户票据的唯一Cookie名 

  4. loginUrl:将用户从定位到哪个页面登入 

  5. defaultUrl:当用户登入成功后默认跳转页面 

  6. timeout:设置用于存储用户票据的唯一Cookie的持续时间(分钟),此时间相对,每次用户进行验证,该Cookie期限被重新设置 

  7. path:设置Cookie的保存路径 

  8. protection有四个值: 

  9.     Encryption:对Cookie内容加密 

  10.     Validation:向Cookie内容添加MAC(消息验证代码),以便服务器判断Cookie是否被篡改 

  11.     None:禁用加密和篡改检查 

  12.     All:同时启用加密和篡改检查 

  13. */  


 

2.Login.aspx页面

[c-sharp] view plaincopy

  1. //单击登入按钮事件处理  

  2.     protected void login_Click(object sender, EventArgs e)  

  3.     {  

  4.         //通过和配置文件<credentials>节点中定义的用户信息比对,验证用户名密码是否合格  

  5.         //合格  

  6.         if (FormsAuthentication.Authenticate("lulu""66"))  

  7.         {  

  8.             //创建用户身份验证票据  

  9.             FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(  

  10.                 1,      //版本信息  

  11.                 "lulu",    //票据中保存的用户标示  

  12.                 DateTime.Now,    //保存票据的Cookie创建时间  

  13.                 DateTime.Now.AddMinutes(40),    //保存票据的Cookie过期时间  

  14.                 false,     //保存票据的Cookie不永久保存  

  15.                 "Admin",  //票据中的用户自定义字段,此处用于存放当前用户的角色信息  

  16.                 FormsAuthentication.FormsCookiePath       //保存票据的Cookie的保存路径(在Web.config文件中配置)  

  17.             );  

  18.   

  19.             //创建一用于保存用户身份验证票据的Cookie  

  20.             //该Cookie的名在配置文件中定义  

  21.             //该Cookie的值为加密(必须加密!)的数据票据  

  22.             HttpCookie ticketCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));  

  23.   

  24.             //将保存有用户身份验证的票据Cookie加入响应流  

  25.             Response.Cookies.Add(ticketCookie);  

  26.             //返回导致重定向的原始页面请求页面  

  27.             Response.Redirect(FormsAuthentication.GetRedirectUrl("lulu",false), true);  

  28.         }  

  29.         else  

  30.         {  

  31.             Response.Write("用户名密码验证失败!");  

  32.         }  

  33.     }  


 

3.Global.asax文件

[c-sharp] view plaincopy

  1. //在安全模块建立起当前用户的有效的身份时,该事件被触发。在这个时候,用户的凭据将会被验证  

  2.     void Application_AuthenticateRequest(object sender, EventArgs e)  

  3.     {  

  4.         //获取当前请求中保存有用户身份票据的Cookie  

  5.         HttpCookie ticketCookie = Request.Cookies[FormsAuthentication.FormsCookieName];  

  6.   

  7.         //如该Cookie不为空,如存在身份票据,解析票据信息,创建用户标识,获取用户角色  

  8.         if (ticketCookie != null)  

  9.         {  

  10.             //获取用户票据  

  11.             FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(ticketCookie.Value);  

  12.   

  13.             string[] roles = ticket.UserData.Split(',');  

  14.               

  15.             //创建用户标识  

  16.             FormsIdentity identity = new FormsIdentity(ticket);  

  17.               

  18.             //创建用户身份主体信息  

  19.             System.Security.Principal.GenericPrincipal user = new System.Security.Principal.GenericPrincipal(identity, roles);  

  20.   

  21.             //把由用户标识,角色信息组成的户身份主体信息保存在User属性中  

  22.             HttpContext.Current.User = user;  

  23.         }  

  24.     }    

 

4.在User.aspx等页面中判断

[c-sharp] view plaincopy

  1. //判断用户是否验证  

  2.  if (Page.User.Identity.IsAuthenticated)  

  3.  { }  

  4.   

  5.  //确定当前用户是否属于自定角色  

  6.  if (Page.User.IsInRole("Admin"))  

  7.  { }