ASP.NET 2.0 中的窗体身份验证

本文详细介绍了ASP.NET中的窗体身份验证机制,包括如何通过FormsAuthentication类创建身份验证Cookie,其内部过程涉及加密、签名及Cookie属性设置等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

窗体身份验证 Cookie

 

调用 FormsAuthentication.SetAuthCookieFormsAuthentication.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 属性设置为 AllEncryption,则窗体身份验证使用 Encrypt 方法对窗体身份验证票进行加密和签名。

string encryptedTicket = FormsAuthentication.Encrypt(ticket); 以下文本 显示 了当 protection 属性设置为 All 时使用的过程:

·

创建序列化窗体身份验证票。创建票证的字节数组表示形式。

·

对窗体身份验证票进行签名。字节数组的消息身份验证代码 (MAC) 的值,由使用 machineKey 元素的 validationvalidationKey 属性指定的算法和密钥进行计算。默认情况下,使用 SHA1 算法。

·

对窗体身份验证票进行加密。已经创建的第二个字节数组使用 FormsAuthentication 类的 Encrypt 方法进行加密。该 Encrypt 方法在内部使用由 machineKey 元素上的 decryptiondecryptionKey 属性指定的算法和密钥。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 的 pathdomainexpires 属性。

·

Cookie 添加到 Cookie 集合。将身份验证 Cookie 添加到要返回给客户端浏览器的 Cookie 集合。

Response.Cookies.Add(authCookie);

每次在身份验证之后 接收 一个后续请求时,FormsAuthenticationModule  类都会从身份验证 Cookie 中检索身份验证票,对其进行解密,计算哈希值,并 比较 该 MAC 值,以帮助确保该 Cookie 未被篡改。最后,验证该窗体身份验证票中包含的到期时间。

ASP.NET 并不依赖于 Cookie 的到期日期,因为该时间很容易伪造。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值