Forms 身份验证的控制流

来源:互联网 发布:js 隐藏class 编辑:程序博客网 时间:2024/05/16 11:36

Forms 身份验证的控制流如下表所示。

步骤 浏览器 服务器答复 1 从服务器请求受保护的资源。
GET /default.aspx
如果不存在身份验证 Cookie,则将请求重定向到登录页以收集凭据。有关起始页的信息使用 RETURNURL 作为关键字放置在查询字符串中。
302 FoundLocation: https://samples.microsoft.com/logon.aspx?RETURNURL=/default.aspx
2 重定向到登录页。
GET /logon.aspx?RETURNURL=/default.aspx
返回登录页。(使用安全套接字层 (SSL) 保护用户的凭据不会以明文形式发送,至少对于发送回登录页时应该如此。)
200 OK
3 用户在登录窗体中输入凭据。
POST /logon.aspx?RETURNURL=/default.aspx
验证用户凭据,如果凭据通过验证,则将浏览器重定向到从登录票中检索到的原始 URL。身份验证票作为 Cookie 发出。
302 FoundLocation: /default.aspx
4 遵循重定向操作并再次请求原始资源。
GET /default.aspx
如果用户已被授权,则允许访问并授予身份验证 Cookie,该 Cookie 中包含身份验证票。同一浏览器会话的以后的请求将在模块检查该 Cookie 时进行身份验证。可以创建可用于以后的会话的持久性 Cookie,但只能到 Cookie 的到期日期为止。
200 OKSet-Cookie: ASPXTICKET=ABCDEFG12345;Path=/

注意,路径设置为 /。由于 Cookie 名称区分大小写,这是为了防止站点中的 URL 的大小写不一致而采取的一种保护措施。例如,如果路径设置为 /SavingsPlan,而链接包含 /savingsplan,由于浏览器不会发送 Cookie,用户将被迫重新进行身份验证。

 

Forms 身份验证凭据

可以允许 FormsAuthenticationModule 根据应用程序配置文件处理身份验证过程。有效的用户/密码对可以放置在配置文件的 <credentials> 部分。可以将从请求登录特权的用户处收集到的凭据与 <credentials> 部分中的用户/密码对列表相比较,从而确定是否允许访问。在下面的示例中,如果用户 Kim 和 John 提供了正确的密码就可以登录。

<credentials passwordFormat="SHA1" >    <user name="Kim"          password="07B7F3EE06F278DB966BE960E7CBBD103DF30CA6"/>    <user name="John"           password="BA56E5E0366D003E98EA1C7F04ABF8FCB3753889"/></credentials>

注意,凭据对必须包含在 <credentials> 部分中,指定的密码哈希格式为“安全哈希算法 1”(SHA1),用户名为明文形式,密码则使用 SHA1 算法进行散列运算。

passwordFormat 属性是必需的;其可能的值列在下表中。

值 说明 Clear 密码以明文形式存储。用户密码可与此值直接比较,而不需要进行进一步的转换。 MD5 使用消息摘要 5 (MD5) 哈希摘要存储密码。为了验证凭据,将使用 MD5 算法对用户密码进行散列运算并与此值比较检查它们是否相等。使用此值时,从不存储或比较明文密码。此算法的性能比 SHA1 好。 SHA1 使用 SHA1 哈希摘要存储密码。为了验证凭据,将使用 SHA1 算法对用户密码进行散列运算并与存储在配置文件中的哈希值比较检查它们是否相等。从不存储明文密码。使用此算法可获得最佳安全性。

.NET Framework 包括一些类和方法,这些类和方法便于您以编程方式创建哈希值进行永久存储。FormsAuthentication 类是对此任务的编程很有帮助的一个类。它的 HashPasswordForStoringInConfigFile 方法可以进行散列运算。在较低级别上,还可以使用 System.Security.Cryptography 类。

存储在文本文件中的哈希密码不能用于重新生成原始密码,但它们可能容易受到字典式攻击。在这种类型的攻击中,攻击者在获得对密码文件的访问权限之后,通过使用软件对一个大字典中的所有单词反复进行散列运算并将生成的哈希与存储的哈希进行比较,试图猜出密码。如果通过任何存储机制存储哈希密码,则您应该要求您的用户在选择密码时不要使用常用的单词,并且密码要包含一些数字和非文字数字字符以防止字典式攻击。

原创粉丝点击