调用 FormsAuthentication.SetAuthCookie 或FormsAuthentication.RedirectFromLoginPage 方法 时,FormsAuthentication 类自动创建身份验证 Cookie。
典型的窗体身份验证 Cookie 中包括以下属性:
·
Name。该属性指定 Cookie 的名称。
·
Value。该属性指定 Cookie 的值。
在典型的窗体身份验证 Cookie 中,该值包含一个经过加密和签名的 FormsAuthenticationTicket 对象的字符串表示形式。该 Cookie 包含以下属性:
·
Expires 。该属性指定 Cookie 的到期日期和时间。仅当 代码 指示应该颁发一个持久的窗体身份验证 Cookie,窗体身份验证才设置该值。
·
Domain。该属性指定与 Cookie 关联的域。默认值为 null。
·
HasKeys。该属性指出 Cookie 是否有子项。
·HttpOnly 。该属性指定是否可以通过 客户端 脚本访问该 Cookie。在 ASP.NET 2.0 中,该值始终设置为 true。Internet Explorer 6 Service Pack 1 支持该 Cookie 属性,从而防止客户端脚本从 document.cookie 属性访问该 Cookie。如果尝试从客户端脚本访问该 Cookie,则返回一个空字符串。无论何时用户浏览到当前域中的 Web 站点,该 Cookie 仍然发送至 服务器 。
注 不支持 HttpOnly Cookie 属性的 Web 浏览器要么忽略该 Cookie,要么忽略该属性,这意味着会话仍然容易受到跨站点脚本的攻击。
·Path 。该属性指定 Cookie 的 虚拟 路径。默认值为"/",代表根目录。
·Secure。该属性指出 Cookie 是否应该仅通过 HTTPS 连接传输。Secure 属性应设置为 true ,以便该 Cookie 可以受 SSL 加密的 保护 。
·Version。该属性指定 Cookie 的版本号。
创建身份验证 Cookie
通过 FormsAuthentication 类创建身份验证 Cookie,如下所示。用户经过验证后,FormsAuthentication 类在内部创建一个 FormsAuthenticationTicket 对象,方法是指定 Cookie 名、Cookie 版本、目录路径、Cookie 颁发日期;Cookie 到期日期、是否应该保留 Cookie,以及用户定义的 数据 (可选)。
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); 接下来,如果 forms 元素 的 protection 属性设置为 All 或 Encryption,则窗体身份验证使用 Encrypt 方法对窗体身份验证票进行加密和签名。
string encryptedTicket = FormsAuthentication.Encrypt(ticket); 以下文本 显示 了当 protection 属性设置为 All 时使用的过程:
·
创建序列化窗体身份验证票。创建票证的字节数组表示形式。
·
对窗体身份验证票进行签名。字节数组的消息身份验证代码 (MAC) 的值,由使用 machineKey 元素的 validation 和 validationKey 属性指定的算法和密钥进行计算。默认情况下,使用 SHA1 算法。
·
对窗体身份验证票进行加密。已经创建的第二个字节数组使用 FormsAuthentication 类的 Encrypt 方法进行加密。该 Encrypt 方法在内部使用由 machineKey 元素上的 decryption 和 decryptionKey 属性指定的算法和密钥。ASP.NET 1.1 版在默认情况下使用 3DES 算法。ASP.NET 2.0 版在默认情况下使用 Rinjdael (AES) 算法。
·
根据需要创建 HTTP Cookie 或 查询 字符串。然后,如果窗体身份验证针对 cookieless 身份验证进行了配置,则加密的身份验证票添加到 HttpCookie 对象。使用以下代码创建该 Cookie 对象:
HttpCookie authCookie = new HttpCookie( FormsAuthentication.FormsCookieName, encryptedTicket); ·
将窗体身份验证Cookie 设置为安全的。如果窗体身份验证票配置为使用 SSL,则 HttpCookie.Secure 属性设置为 true。这表明浏览器仅通过 HTTPS 连接发送 Cookie。
authCookie.Secure = true; ·
设置 HttpOnly 位。在 ASP.NET 2.0 中,始终设置该位。
·
设置适当的 Cookie 属性。如果需要,设置 Cookie 的 path、domain 和 expires 属性。
·
将 Cookie 添加到 Cookie 集合。将身份验证 Cookie 添加到要返回给客户端浏览器的 Cookie 集合。
Response.Cookies.Add(authCookie);
每次在身份验证之后 接收 一个后续请求时,FormsAuthenticationModule 类都会从身份验证 Cookie 中检索身份验证票,对其进行解密,计算哈希值,并 比较 该 MAC 值,以帮助确保该 Cookie 未被篡改。最后,验证该窗体身份验证票中包含的到期时间。
注 ASP.NET 并不依赖于 Cookie 的到期日期,因为该时间很容易伪造。