基于窗体的身份验证-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

基于窗体的身份验证

简介:

基于窗体的身份验证是一项 ASP.NET 身份验证服务,它使应用程序能够提供自己的登录用户界面并进行自己的凭据验证。ASP.NET 对用户进行身份验证,将未经身份验证的用户重定向到登录页,并执行所有必要的 Cookie 管理。这种身份验证是许多网站使用的流行方法。 
应用程序必须配置为使用基于窗体的身份验证,方法是将 <authentication> 设置为 Forms,并拒绝匿名用户访问。下面的示例演示如何在所需应用程序的 Web.config 文件中完成此操作:

<configuration>
  <system.web>
    <authentication mode="Forms"/>
    <authorization>
        <deny users="?" />
    </authorization>
  </system.web>
</configuration>
管理员使用基于窗体的身份验证来配置要使用的 Cookie 的名称、保护类型、用于登录页的 URL、Cookie 有效的时间长度,以及用于已发出的 Cookie 的路径。下表显示 <Forms> 元素的有效属性,该元素是下面的示例中显示的 <authentication> 元素的子元素:
<authentication mode="Forms">
   <forms name=".ASPXCOOKIEDEMO" loginUrl="login.aspx" defaultUrl="default.aspx" 
          protection="All" timeout="30" path="/" requireSSL="false" 
          slidingExpiration="true" enableCrossAppRedirects="false"
          cookieless="UseDeviceProfile" domain="">
          <!-- protection="[All|None|Encryption|Validation]" -->
          <!-- cookieless="[UseUri | UseCookies | AutoDetect | UseDeviceProfile]" -->
   </forms>
</authentication>

属性
说明

cookieless
ASP.NET 2.0 Forms 身份验证可以将 Forms 身份验证票存储在 Cookie 中也可以以无 Cookie 的表示形式存储在 URL 上。UseDeviceProfile 的默认值表示 ASP.NET 根据预先计算得到的浏览器配置文件来确定存储票证的位置。AutoDetect 选项使 ASP.NET 动态确定浏览器是否支持 Cookie。UseUri 和 UseCookies分别强制实施无 Cookie 票证和有 Cookie 票证。

defaultUrl
指定在成功登录后,请求将重定向到的默认 URL。在登录后进行重定向时,如果重定向 URL 对于 Forms 身份验证不可用,则使用此值。

domain
指定包含 Forms 身份验证票的 HttpCookie 的 Domain 属性的值。显式设置此属性可使应用程序共享同一个 Cookie,前提是这些应用程序共享某个 DNS 命名空间的一个公共部分(例如,如果 domain 属性设置为“contoso.com”,则 appA.contoso.com 和 appB.contoso.com 可以共享一个 Cookie)。

enableCrossAppRedirects
在 ASP.NET 2.0 中,Forms 身份验证允许以查询字符串变量或窗体 POST 变量的形式在应用程序之间传递 Forms 身份验证票。将此属性设置为 true 可使 FormsAuthenticationModule 能够从查询字符串或窗体 POST 变量提取票证。

loginUrl
指定未经身份验证的用户的请求将被重定向到的 URL。该 URL 可以在同一台计算机上或在远程计算机上。如果是在远程计算机上,则两台计算机上 machineKey 配置元素中的 decryptionkey 和 validationKey 属性都需要使用相同的值。

name
用于身份验证的 HTTP Cookie 的名称。注意,如果多个应用程序需要在一台计算机上使用基于窗体的身份验证服务,并且每个应用程序都希望由应用程序隔离 Forms 身份验证 Cookie,则每个应用程序都应配置一个唯一的 Cookie 值。为避免在 URL 中产生依赖项,在设置身份验证 Cookie 时,ASP.NET 还使用“/”作为 Path 值,以便将这些 Cookie 发送回站点上的每个应用程序。

path
用于发出的 Cookie 的路径。默认值为“/”,以避免路径中大小写不匹配的造成的困难,因为在返回 Cookie 时,浏览器是严格区分大小写的。共享服务器环境中的应用程序应使用此指令来维护专用 Cookie。(它们还可以使用 API 在运行时指定路径来发出 Cookie。)

protection
用于保护 Cookie 数据的方法。有效值如下:

  • All:同时使用数据验证和加密来保护 Cookie。所配置的数据验证算法是基于 <machinekey> 元素的。如果密钥足够长(48 个字符),默认情况下将使用 AES 进行加密。All 是默认(和建议)值。
  • None:用于仅将 Cookie 用于个性化设置并且安全性要求不高的站点。加密和验证都可以被禁用。尽管以此方式使用 Cookie 需谨慎,但对于使用 .NET Framework 实现个性化设置的任何方法,此设置提供了最佳性能。
  • Encryption:使用 AES、TripleDES 或 DES 加密 Cookie,但不对 Cookie 进行数据验证。这类 Cookie 容易受到精心选择的纯文本的攻击。
  • Validation:不加密 Cookie 的内容,但验证 Cookie 数据在传输过程中是否未被更改。若要创建 Cookie,验证密钥在缓冲区中与 Cookie 数据连接,并且计算出 MAC 并将其追加到输出的 Cookie。

requireSSL
如果设置为 true,则 Forms 身份验证会设置 Forms 身份验证 Cookie 的安全位。兼容的浏览器只将 Cookie 通过 SSL 连接发送回 ASP.NET。注意,如果使用无 Cookie Forms 身份验证,则此设置无效。

slidingExpiration
如果设置为 true,则 Forms 身份验证将定期更新 Forms 身份验证票的生存期。无论票证是包含在 Cookie 中,还是以无 Cookie 的格式包含在 URL 中,都会进行此操作。

timeout
时间量(以整数分钟为单位),经过该时间量之后,Cookie 则会过期。默认值是 30。超时属性是一个可调值,从收到上次请求的时间开始计算,它将在 n 分钟后过期。为了避免对性能产生负面影响,也为了避免那些打开了 Cookie 警告的应用程序产生多个浏览器警告,Cookie 在超时时间过半时更新。(这意味着在某些情况下可能会出现精度损失。)

配置了应用程序后,需要提供一个登录页。下面的示例演示一个简单的登录页。该示例在运行时需要 Default.aspx 页。未经身份验证的请求被重定向到登录页 (Login.aspx),该页显示一个简单窗体,提示用户输入电子邮件地址和密码。(使用 Username="someone@www.contoso.com" 和 Password="password" 作为凭据。) 
验证了凭据后,应用程序调用以下内容:

C# 
VB

		
FormsAuthentication.RedirectFromLoginPage(UserEmail.Value, PersistCookie.Checked);
		
FormsAuthentication.RedirectFromLoginPage(UserEmail.Value, PersistCookie.Checked)

这将用户重定向回最初请求的 URL。不想执行重定向的应用程序既可以调用 FormsAuthentication.GetAuthCookie 来检索 Cookie 值,也可以调用 FormsAuthentication.SetAuthCookie 将正确加密的 Cookie 附加到输出的响应中。对于提供嵌入在包含页中的登录用户界面的应用程序,或者想要更多地控制用户被重定向到的位置的应用程序而言,这些方法很有用。 
身份验证 Cookie 既可以是临时的,也可以是永久(“持久”)的。临时 Cookie 只在当前浏览器会话期间保持。当浏览器关闭时,Cookie 即会丢失。永久 Cookie 由浏览器保存,并在浏览器各会话期间发回,除非用户显式删除 Cookie 或 Cookie 的生存期结束。临时 Cookie 和永久 Cookie 的 Cookie 生存期由 timeout 配置属性确定。这一点在行为上与 ASP.NET 的早期版本相比稍有更改,在早期版本中永久 Cookie 的生存期为 50 年。在 ASP.NET 2.0 中,临时 Cookie 和永久 Cookie 的过期日期设置为当前时间加上 timeout 配置属性的值。

C# Forms-Based/Cookie Authentication
Run Sample View Source

Forms 身份验证所使用的身份验证 Cookie 由 System.Web.Security.FormsAuthenticationTicket 类的序列化版本组成。信息包括用户名(但没有密码)、使用的 Forms 身份验证版本、发出 Cookie 的日期以及可选的应用程序特定数据的字段。 
通过使用 FormsAuthentication.SignOut 方法,应用程序代码可以撤消或移除身份验证 Cookie。这将移除身份验证 Cookie,不论它是临时的还是永久的。 
还可以使用配置为基于窗体的身份验证服务提供有效凭据的列表,如下例所示:

<authentication>
    <credentials passwordFormat="SHA1" >
        <user name="Mary" password="94F85995C7492EEC546C321821AA4BECA9A3E2B1"/>
        <user name="John" password="5753A498F025464D72E088A9D5D6E872592D5F91"/>
    </credentials>
</authentication>
还可以通过使用 FormsAuthentication.HashPasswordForStoringInConfigFile(String password, String passwordFormat) API 生成密码的哈希表示形式。此方法支持使用 SHA1 或 MD5 生成哈希值。然后,应用程序可以调用 FormsAuthentication.Authenticate 并提供用户名和密码,ASP.NET 将验证凭据。根据 passwordFormat 属性的下列值,凭据可以存储在明文中,也可以存储为 SHA1 或 MD5:

Hash 类型
说明

Clear
密码以明文形式存储

SHA1
密码存储为 SHA1 摘要

MD5
密码存储为 MD5 摘要



    本文转自永春博客园博客,原文链接:http://www.cnblogs.com/firstyi/archive/2006/11/13/558916.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: