Forms验证与验证票相关

    技术2022-05-20  46

    一般登录的时候,会有以下具体的流程:

    1. 在浏览器中有个登录窗体,要输入用户名和密码等凭证,通过提交给服务器的ASP.NET网站来审核,检查是否正确。

    2. 如果凭证正确,那么就会再服务器端创建一个FormsAuthenticationTicket实例,其中含有信息:

    Cookie 的路径。注意,窗体的路径设置为 URL 的大小写不一致而采取的一种保护措施。这在刷新Expiration:获取/时间。

    Cookie,则返回 Cookie 将限制在浏览器生命周期范围内。

    Cookie 的日期Name:获取与身份验证UserData :获取存储在Version:返回字节版本号供将来使用。

    3. 这个FormsAuthenticationTicket实例被加密成一个字符串,写入到web.configform节点name属性指定的cookie中,然后发送到客户端。

    4. 然后将用户重定向到最初请求的URL中。

    Forms验证中的API

    组成Forms验证的API以及相关的类:

    FormsAuthenticationModule:对每个请求进行验证的HTTP模块

    FormsAuthentication:包含在Forms验证中我们常用的方法和属性(很重要的)

    FormsIdentityForms验证标识。

    FormsAuthenticationTicket:身份验证的票据,对用户的信息进行加密后的产物,我们一般把它加密成字符串写到cookie中。

    上面的类在System.Web.Security下。

    FormsAuthenticationModule

    它是一个实现了IHttpModule接口的类。它可以用来处理每个请求的Application_AuthenticateRequest事件。如果发送了的请求中已经包含了cookie信息,那么这个模块就对cookie信息进行解密和解析,然后构造一个GenericPrincipal的类实例填充Context.User,并且也创建一个FormsIdentity的实例。

    注意:当我们在web.config中配置了Forms验证后,那么我们在Application_AuthenticateRequest事件写的代码要是和Forms相关的API

    FormsAuthentication

    这个类很重要。

    它有很多的其他方法和属性:

    FormsAuthenticate中涉及到客户端保存cookie的两个属性就是:

    FormsCookieName:获取或者设设置cookie的名称

    FormsCookiePath:获取或者设置cookieurl路径

    其中FormsCookiePath属性有一点要注意:大多数的浏览器会在判断cookie是否要和请求一起发送时,用到cookie路径。(我们一般在配置文件配置path="/"),如果我们配置的path不是"/",那么这个cookie就不会和请求发送到服务器端。

    FormsAuthenticate中和cookie操作相关的方法有:

    Decrypt:提取身份验证cookie的加密信息,创建FormsAuthenticationTicket,也就是解密。

    Encrypt:加密。从FormsAuthenticationTicket中获取信息,并且加密。以备我们之后把加密的信息写入cookie

    GetAuthCookie:创建身份验证cookie,但是并不把它立即添加到HTTP响应中。

    SetAuthCookie:创建身份验证cookie,并且把它添加到Response.Cookie中。

    RenewTicketIfOld:刷新身份验证cookie的生命周期。

    GetRedirectUrl:把用户重定向到他们最初请求的页面。

    SignOut:使得当前的身份验证cookie过期。我们常用的注销功能。

     

    附:代码(从身份验证票中取出用户登陆ID) 

    /// <summary> /// Forms验证中,从用户的身份验证票中取出用户ID /// </summary> /// <returns>登录用户的ID</returns> public static string GetPIDFromForms() { HttpCookie encryptedTicketCki = HttpContext.Current.Request.Cookies[".djnkfijnuyjoa4739df"]; string PID = null; if (encryptedTicketCki != null) { FormsAuthenticationTicket ticketback = FormsAuthentication.Decrypt(encryptedTicketCki.Value); PID = ticketback.Name; } return PID; }

     其中, .djnkfijnuyjoa4739df  来源为web.config中的配置:

    <authorization> <deny users="?" /> </authorization> <authentication mode="Forms"> <forms loginUrl="login.aspx?forms=false" name=".djnkfijnuyjoa4739df" timeout="60" path="/" /> </authentication>

    最新回复(0)