这样才能保证HttpContext对象和线程指向同一个验证用户的信息。
Forms Authentication Cookies
FormsAuthentication类在调用FormsAuthentication.SetAuthCookie或者FormsAuthentication.RedirectFromLoginPage的方法后会自动创建验证Cookie;
一个典型的验证cookie包含以下两个属性:
Name:Cookie的名称
Value:Cookie的值
在一个典型的forms authentication cookie中,cookie的值是加密的,并且创建一个FormAuthenticationTicket的签名。Cookie包含以下属性:
Expires:此属性标识cookie的过期时间,当用户需要把cookie保存在本地电脑上时,需要设置此属性。
Domain:这个属性表明cookie和哪个域相关联,默认的值为null
HasKeys:这个属性表明cookie是否有子键。
HttpOnly: 这个属性表示cookie是否能被客户端脚本读取,.net2.0中,这个设置始终为true;但在客户端浏览器中,只有IE6.0才能识别这个属性。
Path:这个属性表明cookie的虚拟目录。默认的值为”/”,表示站点根目录。
Secure:这个属性表明cookie是否需要加密。如果设置true,cookie将接受SSL加密
Version:这个属性表明cookie的版本号
创建Forms Authentication Cookies
当某个用户验证通过后,Forms Authentication Cookies会被Forms Authentication类在内部自动创建。创建的就是一个FormsAuthenticationTicket类。创建此类的代码如下:
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
"userName",
DateTime.Now,
DateTime.Now.AddMinutes(30), // value of time out property false, // Value of IsPersistent property
String.Empty,
FormsAuthentication.FormsCookiePath);
然后如果在web.config文件中,forms元素的protection属性被设置成ALL
或者Encryption,将对ticket对象进行加密并且创建签名。加密代码如下:
string encryptedTicket = FormsAuthentication.Encrypt(ticket);
下面将简要介绍一下当protection属性被设置为true时的流程:
创建一个序列化的forms authentication ticket:即创建此对象为一个字节数组(byte array)
创建forms authentication ticket的签名。machineKey中的validation和alidationKey的属性所设置了生成签名的算法。我们用此算法计算上面序列化的bytearray,生成MAC(message authentication code)。在默认的选择中,系统使用的是SHA1的算法。
加密forms authentication ticket,同时我们将创建另外一个序列化的对象,此对象经过加密算法加密。这个加密算法也可在machineKey中的decryption和decryptionKey的属性中获得。在asp.net 1.1中使用的是3DES加密,而在asp.net2.0中,使用的是AES加密算法。
创建HttpCookie对象或者生成cookie的query string,(在不支持cookie时,我们只能生成Query String).HttpCookie 对象创建方法代码如下:
HttpCookie authCookie = new HttpCookie(
FormsAuthentication.FormsCookieName,
encryptedTicket);
加密后的ticket就被添加到了HttpCookie对象中。
设置forms authentication cookie为安全的。如果forms authentication ticket被配置成为使用SSL,那么HttpCookie. Secure的属性也必须设置成true.在这种情况下,浏览器只能通过HTTPS协议传送Cookies.
设置