一般登录的时候,会有以下具体的流程:
1. 在浏览器中有个登录窗体,要输入用户名和密码等凭证,通过提交给服务器的ASP.NET网站来审核,检查是否正确。
2. 如果凭证正确,那么就会再服务器端创建一个FormsAuthenticationTicket实例,其中含有信息:
Cookie 的路径。注意,窗体的路径设置为 URL 的大小写不一致而采取的一种保护措施。这在刷新Expiration:获取/时间。
Cookie,则返回 Cookie 将限制在浏览器生命周期范围内。
Cookie 的日期Name:获取与身份验证UserData :获取存储在Version:返回字节版本号供将来使用。
3. 这个FormsAuthenticationTicket实例被加密成一个字符串,写入到web.config中form节点name属性指定的cookie中,然后发送到客户端。
4. 然后将用户重定向到最初请求的URL中。
Forms验证中的API
组成Forms验证的API以及相关的类:
FormsAuthenticationModule:对每个请求进行验证的HTTP模块
FormsAuthentication:包含在Forms验证中我们常用的方法和属性(很重要的)
FormsIdentity:Forms验证标识。
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:获取或者设置cookie的url路径
其中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>