创建身份验证 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 的到期日期,因为该时间很容易伪造。
角色授权
在 ASP.NET 2.0 中,角色授权已经得到简化。对用户进行身份验证或者将角色细节添加到身份验证 Cookie 时,不再需要检索角色信息。.NET Framework 2.0 包括一个角色管理 API,它使您能够创建和删除角色,将用户添加到角色以及从角色删除用户。该角色管理 API 将其数据存储在一个基础数据存储中,它通过针对该数据存储的适当角色提供程序访问该存储。以下角色提供程序为 .NET Framework 2.0 附带,可以与窗体身份验证一起使用:
| • |
SQL Server。它是默认的提供程序,将角色信息存储在 SQL Server 数据库。 |
| • |
授权管理器 (AzMan)。该提供程序使用 XML 文件、Active Directory 或 Active Directory 应用程序模式 (ADAM) 中的一个 AzMan 策略存储作为其角色存储。它通常用于 Intranet 或 Extranet 方案中,其中 Windows 身份验证和 Active Directory 用于进行身份验证。 |
有关如何使用角色管理 API 的详细信息,请参阅 How To: Use Role Manager in ASP.NET 2.0。
Cookieless 窗体身份验证
asp.net 2.0 支持 cookieless 窗体身份验证。该功能由 forms 元素的 cookieless 属性控制。该属性可以设置为以下四个值之一:
| • |
UseCookies。该值强制 formsauthenticationmodule 类使用 Cookie 传输身份验证票。 |
| • |
UseUri。该值指示 formsauthenticationmodule 类重写 URL 来传输身份验证票。 |
| • |
UseDeviceProfile。该值指示 formsauthenticationmodule 类查看浏览器功能。如果浏览器支持 Cookie,则使用 Cookie;否则,重写 URL。 |
| • |
AutoDetect。该值通过一个动态检测机制指示 formsauthenticationmodule 类检测浏览器是否支持 Cookie。如果检测逻辑表明不支持 Cookie,则重写 URL。 |
如果应用程序配置为使用 cookieless 窗体身份验证,并且正在使用 formsauthentication.redirectfromloginpage 方法,则 formsauthenticationmodule 类自动设置 URL 中的窗体身份验证票。以下代码示例显示了典型 URL 在重写后的外观:
http://localhost/CookielessFormsAuthTest/(F(-k9DcsrIY4CAW81Rbju8
KRnJ5o_gOQe0I1E_jNJLYm74izyOJK8GWdfoebgePJTEws0Pci7fHgTO
UFTJe9jvgA2))/Test.aspx
括号中的 URL 部分包含 Cookie 通常将包含的数据。该数据在请求处理过程中由 ASP.NET 删除。该步骤由 ASP.NET ISAPI 筛选器执行,而不是在 httpmodule 类中执行。如果从一个 .aspx 页读取 request.path 属性,您在 URL 中不会看到任何额外的信息。如果重定向请求,URL 将自动重写。
注 难以保证 URL 中包含的身份验证票的安全。当安全性极为重要时,您应该使用 Cookie 存储身份验证票。
成员身份和登录控件
asp.net 2.0 引入了成员身份功能和一组登录 Web 服务器控件,它们简化了使用窗体身份验证的应用程序的实现。
成员身份为应用程序用户提供凭据存储和管理。它还提供一个成员身份 API,可以在使用窗体身份验证时简化用户凭据的验证任务。该成员身份功能构建于提供程序模型之上。该模型允许实现和配置指向不同用户存储的不同提供程序。ASP.NET 2.0 包括以下成员关系提供程序:
| • |
Active Directory 成员关系提供程序。该提供程序使用 Active Directory 或 Active Directory 应用程序模式 (ADAM) 用户存储。 |
| • |
SQL Server 成员关系提供程序。该提供程序使用 SQL Server 用户存储。 |
还可以添加对自定义用户存储的支持。例如,可以添加对其他轻量级目录访问协议 (LDAP) 目录或其他现有公共标识存储的支持。为此,创建一个从 membershipprovider 抽象基类继承的自定义提供程序。
asp.net 登录控件自动使用成员身份和窗体身份验证,并封装提示用户输入凭据,验证用户,恢复或替换密码等所需的逻辑。实际上,ASP.NET 登录控件在窗体身份验证和成员身份上提供一个抽象层,并且取代了您使用窗体身份验证时通常必须进行的大多数或全部工作。
有关使用成员身份功能和登录控件的详细信息,请参阅 How To: Use Membership in ASP.NET 2.0。
Web 场方案
在 Web 场中,无法确保哪个服务器将处理连续请求。如果用户在一台服务器上经过身份验证,但下一个请求在另一台服务器上进行,则身份验证票将导致验证失败并请求用户重新进行身份验证。
machineKey 元素中的 validationkey 和 decryptionkey 属性用于对窗体身份验证票进行哈希操作和加密。这些属性的默认值为 autogenerate.isolateapps。这些密钥是针对每个应用程序自动生成的,在每台服务器上都不同。因此,在一台计算机上加密的身份验证票无法在 Web 场中的另一台计算机或者同一台 Web 服务器上的另一个应用程序中进行解密和验证。
为了解决该问题, Web 场中所有计算机上的 validationkey 和 decryptionkey 值都必须相同。有关配置 machinekey 元素的详细信息,请参阅 How To: Configure MachineKey in ASP.NET 2.0。
其他资源
| • |
How To: Protect Forms Authentication in ASP.NET 2.0 |
| • |
How To: Use Forms Authentication with SQL Server in ASP.NET 2.0 |
| • |
How To: Use Forms Authentication with Active Directory in ASP.NET 2.0 |
| • |
How To: Use Forms Authentication with Active Directory in Multiple Domains in ASP.NET 2.0 |
相关专题
- .NET移动与嵌入式技术 (5968篇文章)
- .NET开发手册 (5669篇文章)
- ASP.NET教程 (8464篇文章)
- .NET框架架构 (467篇文章)
- ASP.NET应用篇 (2639篇文章)
- .NET开发人员犯的6大安全错误 (6次浏览)
- 请跟我来--使用Ext搞个原型 (1次浏览)
- ASP.NET 3.5 Extensions带来什么 (1次浏览)
- 应用WEB标准会使ScrollTop属性失效! (0次浏览)
- Cache用法之缓存页面和缓存数据 (0次浏览)
- 支持正则表达式的UrlMapping (0次浏览)
- 关于ASP.NET 2.0的目录结构变化 (0次浏览)
- WPF中Closing窗体时调用Hide()方法异常 (0次浏览)
- 对象数组根据某属性列的灵活排序 (0次浏览)
- DB2 9和ASP.NET 2.0构建下一代应用程序 (0次浏览)



