Form身份验证基本原理

16 篇文章 0 订阅

先说说Form身份验证思路:

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

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

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

 

解释下我的文件目录:

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

              -> Admin.aspx

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

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

-> Global.asax

-> web.config

 

1.web.config文件

[xhtml]  view plain copy
  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 plain copy
  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 plain copy
  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 plain copy
  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 plain copy
  1. //判断用户是否验证  
  2.  if (Page.User.Identity.IsAuthenticated)  
  3.  { }  
  4.   
  5.  //确定当前用户是否属于自定角色  
  6.  if (Page.User.IsInRole("Admin"))  
  7.  { }  

<authentication mode="Forms"/>

1 指示是否发生身份验证的方法
System.Web.HttpContext.Current.User.Identity.IsAuthenticated;
或者Request.IsAuthenticated;

2 获取用户名的方法
   FormsIdentity Id = (FormsIdentity)HttpContext.Current.User.Identity;
   FormsAuthenticationTicket Ticket = Id.Ticket ; //取得身份验证票
   string userName=Ticket.Name;
或者string userName=User.Identity.Name;

3 登录的部分代码
 

if (FormsAuthentication.GetRedirectUrl(userName, false).EndsWith("default.aspx"))

 {

  //FormsAuthentication.SetAuthCookie(userName, persist.Checked);

   FormsAuthenticationTicket authTicket = new

   FormsAuthenticationTicket(1,userName,DateTime.Now,

    DateTime.Now.AddMinutes(20),persist.Checked, role);

   string encryptedTicket = FormsAuthentication.Encrypt(authTicket); //加密

   HttpCookie authCookie =

    new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);

   Response.Cookies.Add(authCookie);

 

  HttpContext.Current.Response.Redirect("default.aspx"true);

 }

 else

 {

  //FormsAuthentication.SetAuthCookie(userName, persist.Checked);

  FormsAuthenticationTicket authTicket = new

   FormsAuthenticationTicket(1,userName,

    DateTime.Now,DateTime.Now.AddMinutes(20),persist.Checked, role);

  string encryptedTicket = FormsAuthentication.Encrypt(authTicket); //加密

  HttpCookie authCookie =

    new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);

  Response.Cookies.Add(authCookie);

 

  HttpContext.Current.Response.Redirect(

    FormsAuthentication.GetRedirectUrl(userName, false), true);

 }

 

================================================

构建基于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, // 版本号。

txtUserName.Text, // 与身份验证票关联的用户名。

DateTime.Now, // Cookie 的发出时间。

DateTime.Now.AddMinutes(20),// Cookie 的到期日期。

false// 如果 Cookie 是持久的,为 true;否则为 false。

roles ); // 将存储在 Cookie 中的用户定义数据。

roles是一个角色字符串数组

string encryptedTicket = FormsAuthentication.Encrypt(authTicket); //加密

 

存入Cookie

HttpCookie authCookie =

new HttpCookie(FormsAuthentication.FormsCookieName,

encryptedTicket);

 

Response.Cookies.Add(authCookie);

 

 

FormsAuthentication.SignOut() 登出

 

 

======================

 

string userName = User.Identity.Name;   //获取与身份验证票关联的用户名

Response.Write(userName);

 

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

FormsAuthenticationTicket Ticket = Id.Ticket; //取得身份验证票

string userName1 = Ticket.Name;

Response.Write("<br>" + userName1);//获取与身份验证票关联的用户名

 

string fd = Ticket.UserData.ToString();

 

Response.Write("<br>"+fd);//获取用户自定义数据

 

 

===============================================

   <authentication mode="Forms">

    <forms name="formvalidata" loginUrl="admin/login.aspx" timeout="30" path= "/">

 

    </forms>

   </authentication>

 

 

   <globalization

   requestEncoding="GB2312"

   responseEncoding="GB2312"

   />

 

    </system.web>

 

<location path="admin">

   <system.web>

    <authorization>

     <deny users="?"/>

    </authorization>

   </system.web>

</location>

 

</configuration>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值