【问题标题】:FormsAuthentication: Is it secure?FormsAuthentication:它安全吗?
【发布时间】:2011-02-08 16:02:25
【问题描述】:

使用 FormsAuthentication 构建到 asp.net 中,可以非常快速和轻松地创建一个为经过身份验证的用户创建 cookie 的登录系统:

FormsAuthentication.SetAuthCookie(uniqueUsername, false);

Web.Config 文件中的一些代码配对:

<authentication mode="Forms">
  <forms loginUrl="Login.aspx" timeout="30" defaultUrl="Dashboard.aspx" protection="All" />
</authentication>
<authorization>
  <deny users="?" />
</authorization>

这会将所有请求退回到 Login.aspx,直到用户被批准并使用 SetAuthCookie() 方法调用创建 cookie。

这足够安全吗?
我使用的经验法则是,我不会在客户端上存储他们没有发送给我的任何数据。所以我过去所做的就是将用户名和密码保存在 cookie 中,然后在每次请求时重新验证。

使用这种方法每次都重新进行身份验证会产生额外的开销,但这也意味着我没有在客户端上存储任何服务器数据。

我的担心
我担心的是,通过使用 SetAuthCookie() 方法调用,用户名被存储在客户端计算机上。那么是否有可能有人破解正在使用的加密并将存储的用户名替换为另一个用户名?

我认为我过于偏执,并且使用的加密类型和级别已经足够,但我想我会就该主题获得一些专家意见。

【问题讨论】:

  • 我不投票结束,这个问题不直接重复上述url。
  • 你为什么有 在 web.config 中?
  • @Rushino OP 有&lt;deny users="?" /&gt; 以仅作为经过身份验证的用户来保护他的整个站点。使用此配置的 OP 声明不允许对其站点进行公共(匿名)访问。这 ?指任何未经身份验证的用户。
  • 如果您使用公共托管站点,您还应该设置您的机器密钥,因为机器密钥是默认用于加密表单身份验证的。如果其他人驻留在您的服务器上,他们将有权访问

标签: asp.net security cookies ssl forms-authentication


【解决方案1】:

所以我过去所做的是将用户名和密码保存在 cookie 中,然后在每次请求时重新验证。

您应该使用这种方法。密码不应存储在身份验证票证中。原因是如果身份验证票证被泄露,那么攻击者就有了用户的密码。可以通过加密身份验证票证 cookie 来减轻这种风险,但我认为您是以纯文本形式存储 cookie。

我担心的是,通过使用 SetAuthCookie() 方法调用,用户名被存储在客户端计算机上。那么是否有可能有人破解正在使用的加密并将存储的用户名替换为另一个用户名?

正如 Shiraz 所说,只有在您创建持久 cookie 时,cookie 才会持久保存在客户端计算机上。 (SetAuthCookie 的参数之一表示是否创建这样的 cookie。

即使有人破坏了加密方案以修改 cookie 以提供不同的用户名,他们也会遇到问题,因为身份验证票证也是经过数字签名的,这意味着 ASP.NET 可以检测 cookie 的内容是否已被修改。要伪造数字签名,攻击者需要知道服务器使用的盐,如果用户能弄清楚这意味着他可以访问您的 Web 服务器的文件系统,那么现在您遇到了更大的问题。

要了解的另一件事是,身份验证票证有一个有效期,这为票证的有效性设置了一个有限的生命周期。因此,即使有人要窃取用户的 cookie,攻击者必须使用该被盗票证的时间也会受到您为表单身份验证系统指定的 timeout 值(默认为 30 分钟)的限制。

总之,官方的 ASP.NET 表单身份验证系统将比单独的开发人员能够实现的安全得多。开发人员应该努力使用表单身份验证系统,而不是出于各种原因推出自己的解决方案,包括更好的安全性、不必重新发明轮子、采用标准实践以使其他加入团队的开发人员没有那么大的学习曲线以加快速度,等等。

有关表单身份验证系统以及如何保护票证、各种&lt;forms&gt; 配置设置如何工作等的详细信息,请参阅:Forms Authentication Configuration and Advanced Topics

【讨论】:

  • @Scott-Mitchell 实际上,过去我确实对通过 SSL 连接存储用户名/密码的会话 cookie 使用了加密。感谢您的解释,我将继续使用 FormsAuthentication。哦,感谢您多年来的 4Guys 文章,自从大约 10 年前我开始使用 ASP 以来,我就一直在使用您的网站...:)
【解决方案2】:

只是一些关于你的思考过程的随机陈述,但关于

所以我过去所做的是保持 中使用的用户名和密码 cookie,然后重新验证这个 每个请求。

@Scott Mitchell 已经提出了这个问题,并讨论了由于安全隐患而不这样做的原因。

我觉得值得指出为什么这没有意义(即使不考虑泄露信息的安全隐患)。您生成表单身份验证票证(cookie)的原因是您让 ASP.NET 使用该票证标记此用户浏览器,让您确认这是已通过身份验证的指定用户。

通过向他们发出票证,您这样做是为了暗示他们不需要像以前那样进行身份验证。

一个很好的类比是你去一家酒吧,在你进去的路上,保镖会扫描你的身份证,以确保你的身份证是合法的,并且你已经 21 岁以上。在确认这一点后,他们会给你一个具有某种颜色/设计的腕带。

使用腕带,您可以离开大楼吸烟,然后绕过排队返回室内,并且需要扫描您的身份证件,以便您当天返回。现在,如果您回家,但不要在上床睡觉时摘下腕带(例如让浏览器在夜间打开),您第二天回到酒吧并尝试展示您的腕带以绕过线路。此时你被拒绝了,因为你有昨晚的腕带,并被告知要排到队伍的后面并再次获得授权。

【讨论】:

  • @Chris-Marisic 比喻很好用
【解决方案3】:

如果您将 DisplayRememberMe 属性设置为 false,则 cookie 将不会保留在客户端计算机上。然后它将被存储在内存中。

如果您使用 HTTPS/SSL,它将在通往客户端计算机的途中受到保护。

那么就只剩下理论上的可能性了:

  • 破解 SSL 加密
  • 从客户端机器的内存中窃取 cookie

随后破解了 cookie 的加密。

可能有一些更简单的方法可以攻击您的系统。

http://msdn.microsoft.com/en-us/library/ms998310.aspx

【讨论】:

    猜你喜欢
    • 2011-01-23
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    相关资源
    最近更新 更多