【问题标题】:ASP.NET Forms Authentication and Persistent Authentication Cookie SecurityASP.NET 表单身份验证和持久身份验证 Cookie 安全性
【发布时间】:2012-08-01 07:44:05
【问题描述】:

当我们在任何 ASP.NET 框架(ASP.NET MVC、Web 窗体等)中使用 ASP.NET 表单身份验证时,我们会将身份验证 cookie 保存在客户端的浏览器中。作为最佳实践,我们将 cookie 设置为 HttpOnly 且安全。我们还通过 SSL 进行所有交易。无论我们使用什么样的机制来验证用户(OAuth、ASP.NET Membership Provider 等),我们仍然需要持久化验证以获得更好的用户体验。

有了所有这些,我假设有人仍然可以从客户端浏览器中获取 cookie 并使用这些 auth cookie 值发出请求。服务器无法检测到这一点,我们会将受保护的数据提供给其他人。

我认为降低风险的一个想法是,每次当她/他尝试采取一些严肃的行动(例如更改电子邮件地址、访问个人资料信息等)时询问客户的密码,但这并没有'什么都解决不了,对客户来说可能很烦人。

对于此类问题,您有什么积极采用的方法吗?或者在客户端浏览器中保持身份验证的最佳方法是什么?

【问题讨论】:

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


    【解决方案1】:

    您已经在使用 HTTPS 并加密 cookie,这是相当安全的。

    如果您仍然担心,我建议您在服务器上存储有关用户会话的其他信息(IP 地址、用户代理等),并根据会话期间提供的信息进行验证。

    如果用户更改了他们的电子邮件地址,您可以向原始电子邮件地址发送一个撤销链接,因此如果该更改未经授权,则真正的所有者会收到有关更改的警报。

    【讨论】:

    • 破解 IP 地址很难,但攻击者可以很容易地提供用户代理。我承认这可能会使事情更难破解。另一方面,如果客户在移动中(经常用他的机器(笔记本电脑、平板电脑等)更改她/他的位置),检查 IP 地址对客户来说可能非常烦人。但我仍然 +1。
    【解决方案2】:

    加上你所做的一切,并牢记this question我额外建议,在服务器上保留更多关于用户的信息以及身份验证cookie,所以如果有人窃取cookie并尝试使用它,也必须满足客户端的所有其他特性才能使用它。

    我保留并检查的其他一些信息与身份验证 cookie 是否相同。

    1. 会话 cookie 与身份验证 cookie 连接。
    2. 关联的浏览器 ID
    3. 用户的ip与
    4. 连接
    5. 必须启用Javascript

    我知道有人可以说所有东西都可以被黑客克隆——如果黑客可以拿走 cookie,为什么不能拿走其余的。好吧,在这种情况下,没有什么是 100% 保证的,如果有人可以获取所有这些信息实际上是可以拥有的,并且密码是它自己和登录 - 至少你让它更安全一点。

    【讨论】:

      【解决方案3】:

      你几乎做的一切都是正确的。

      如果您使用的是会员提供程序,那么 cookie 将被标记为仅 HTTP(如您所说),因此无法通过客户端脚本(例如恶意 XSS)访问它。

      如果您已将 cookie 标记为安全,那么我假设您已将表单身份验证上的“RequireSSL”标志设置为 true。通过这样做,cookie 不会在任何不通过 HTTPS 发出的请求中发送到服务器,因此即使您不小心插入了 HTTP 请求(如果它的内容嵌入在浏览器上,浏览器应该警告用户无论如何HTTPS 页面),cookie 将不会被发送。

      您唯一可以做的另一件事——除了你所拥有的东西之外,这并不能提供太多的防御,但这是一个很好的做法——也是使用 HSTS。我在OWASP Top 10 for .NET developers part 9: Insufficient Transport Layer Protection 中谈到了这一点,作为确保继续通过安全通道发送请求的另一种方法。

      除了对会员服务提供商进行认真的重新设计之外,您真的无能为力。您可以将会话绑定到一个 IP,并且如果它发生变化则不接受请求,但这可能会导致问题(即 IP 发生变化并且不能保护您免受同一地址上的多个人的影响)。您还可以创建浏览器的指纹(即在请求标头中发送的所有内容)并确保后续请求匹配,但我们将在此处详细介绍。

      但归根结底,安全性应根据其所保护资产的价值和恶意活动的可能性进行调整。你不会说你在保护什么,但如果它是一个金融系统,你会比博客上的一个简单评论引擎更努力。

      总之,看起来您做得很好,只需考虑您所实施的措施在您所保护的价值背景下的适当性。哦 - 如果您使用 SQL 成员资格提供程序进行凭证存储,请确保您阅读了 Our password hashing has no clothes 然后停止这样做!

      【讨论】:

      • 谢谢特洛伊,非常好的答案和很好的建议。我应该承认我忽略了将slidingExpiration 设置为false。我假设这会使过期的票无法重新激活。这也为系统增加了信心。你怎么看?
      • 滑动过期在开启时的作用是将会话超时应用于最后一个请求,但当它关闭时,它将应用于会话的开始我>。假设您有 20 分钟的超时并积极使用系统 10 分钟。当滑动过期 on 时,超时将发生在 30 分钟。当它关闭时,超时将发生在 20 分钟。关闭它会减少劫持帐户的机会窗口,但会对可用性产生不利影响。如果您的系统是人们进入的系统,请迅速做他们需要做的事,然后离开,将其关闭。
      • 那么,无论哪种方式,过期的授权cookie都不能使用和重新激活,对吧?
      • 没错,过期后需要重新登录。
      猜你喜欢
      • 2011-06-11
      • 2017-10-26
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多