基于窗体的身份验证是ASP.NET身份验证服务,它使应用程序能够提供它们自己的登录UI和进行它们自己的凭据验证。ASP.NET
验证用户的身份,将未授权的用户重定向到登录页并执行所有必要的Cookie管理。这种身份验证是许多Web站点
使用的流行方法。
应用程序必须被配置成使用基于窗体的身份验证,将<authentication>设置为Forms并且拒绝匿名用户访问。下面的示例说明如何在所需应用程序的
Web.config文件中完成此配置:
<configuration>
<system.web>
<authenticationmode="Forms"/>
<authorization>
<denyusers="?"/>
</authorization>
</system.web>
</configuration>
管理员使用基于窗体的身份验证来配置要使用的Cookie名称、保护类型、用于登录页的URL、Cookie生效的时间长度以及用于已发布
Cookie的路径。下表显示了<Forms>元素(它是下面的示例中显示的<authentication>元素的子元素)的有效属性:
<authenticationmode="Forms">
<formsname=".ASPXCOOKIEDEMO"loginUrl="login.aspx"protection="all"timeout="30"path="/">
<!--protection="[All|None|Encryption|Validation]"-->
</forms>
</authentication>
属性及其说明
loginUrl未授权的用户被重定向到的登录URL。它可以在同一台计算机上或在远程计算机上。如果它在远程计算机上,两台计算机需要对decryptionkey
属性使用相同的值。
name用于身份验证目的的HTTPCookie的名称。注意:如果不止一个应用程序要在一台计算机上使用基于窗体的身份验证服务,则每个应用程序应该配置唯一的
Cookie值。为了避免在URL中导致依赖项,ASP.NET在设置身份验证Cookie时将“/”用作Path值,这使Cookie
被发送回站点上的每个应用程序。
timeout以整数分钟为单位的时间量,超过此时间量,Cookie将过期。默认值是30。超时属性是一个变化值,从收到最后一个请求的时间开始计算,它过期
n分钟。为了避免对性能产生负面影响,也为了避免那些打开了Cookie警告的应用程序产生多个浏览器警告,Cookie在超时时间过半时更新。(这意味着在某些情况下会丢失可能的精度。)
path用于已发出Cookie的路径。默认值为“/”以避免因路径中有不匹配的大小而带来的困难,因为在返回Cookie时,浏览器严格区分大小写。共享服务器环境中的应用程序应该使用此指令维持专用
Cookie。(另一种方法是,它们可以使用API在运行时指定路径以发出Cookie。)
protection用于保护Cookie数据的方法。有效值如下所示:
All:同时使用数据验证和加密来保护Cookie。配置的数据验证算法基于元素。如果三重DES可用并且密钥足够长(48位),则使用三重
DES进行加密。All是默认(和建议)值。
None:用于仅将Cookie用于个性化并且安全要求不高的站点。加密和验证都可以被禁用。尽管以此方式使用Cookie需谨慎,但对于使用
.NET框架实现个性化的任何方法,此设置提供了最佳性能。
Encryption:使用TripleDES或DES加密Cookie,但不对Cookie进行数据验证。这类Cookie容易受到精心选择的纯文本的攻击。
Validation:不加密Cookie的内容,但验证Cookie数据在传输过程中是否未被更改。若要创建Cookie,验证密钥在缓冲区中与
Cookie数据连接,并且计算出MAC并将其追加到输出的Cookie。
配置了应用程序后,需要提供一个登录页。下面的示例显示了一个简单的登录页。示例在运行时要求Default.aspx页。未授权的请求被重定向到登录页
(Login.aspx),此页显示一个简单的窗体,提示用户输入电子邮件地址和密码。(使用Username="jdoe@somewhere.com"和
Password="password"作为凭据。)
验证了凭据后,应用程序调用下列内容:
C#
FormsAuthentication.RedirectFromLoginPage(UserEmail.Value,PersistCookie.Checked);
VB
FormsAuthentication.RedirectFromLoginPage(UserEmail.Value,PersistCookie.Checked)
JScript
FormsAuthentication.RedirectFromLoginPage(UserEmail.Value,PersistCookie.Checked);
这将用户重定向回当初请求的URL。不想执行重定向的应用程序可以或者调用FormsAuthentication.GetAuthCookie
来检索Cookie值,或者调用FormsAuthentication.SetAuthCookie将正确加密的Cookie附加到输出的响应中。对于提供嵌入在包含页中的登录
UI的应用程序,或者想要更多地控制用户被重定向到的位置的应用程序而言,这些方法很有用。身份验证Cookie既可以临时又可以永久(“持久”)。临时
Cookie只在当前浏览器会话期间保持。当浏览器关闭时,临时Cookie随即丢失。永久Cookie则被浏览器保存,并在浏览器会话间回发,直到被用户显式删除。
VB基于窗体的/Cookie身份验证
窗体身份验证使用的身份验证Cookie由System.Web.Security.FormsAuthenticationTicket
类的线性版本组成。信息包括用户名(但没有密码)、使用的窗体身份验证版本、发出Cookie的日期以及可选的应用程序特定数据的字段。
通过使用FormsAuthentication.SignOut方法,应用程序代码可以撤消或移除身份验证Cookie。这将移除身份验证
Cookie,不论它是临时的还是永久的。
还可以使用配置为基于窗体的身份验证服务提供有效凭据的列表,如下例所示:
<authentication>
<credentialspasswordFormat="SHA1">
<username="Mary"password="GASDFSA9823598ASDBAD"/>
<username="John"password="ZASDFADSFASD23483142"/>
</credentials>
</authentication>
应用程序然后可以调用FormsAuthentication.Authenticate并提供用户名和密码,ASP.NET将验证凭据。根据
passwordFormat属性的下列值,凭据可以存储在明文中,或者存储为SHA1或MD5:
哈希类型说明
Clear密码存储在明文中
SHA1密码存储为SHA1摘要
MD5密码存储为MD5摘要