ASP.NET Forms身份验证和持久身份验证Cookie安全性

时间:2012-08-03 09:07:51

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

当我们在任何ASP.NET框架(ASP.NET MVC,Web窗体等)中使用ASP.NET Forms Authentication时,我们会在客户端的浏览器中保留身份验证cookie。作为最佳实践,我们将cookie设置为HttpOnly并且安全。我们还通过SSL进行所有交易。无论我们使用何种机制来验证用户(OAuth,ASP.NET成员资格提供程序等),我们仍然需要保持身份验证以获得更好的用户体验。

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

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

您是否有任何针对此类问题积极关注的方法?或者在客户端浏览器中保持身份验证的最佳方法是什么?

3 个答案:

答案 0 :(得分:6)

你几乎正在做一切正确的事。

如果你正在使用会员资格提供者,那么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然后停止这样做!

答案 1 :(得分:2)

除了你所做的所有事情之外,并且考虑到this question我额外建议,在服务器上保存关于用户的更多信息以及身份验证cookie,所以如果有人偷了cookie并尝试使用它,也必须满足客户的所有其他特性才能使用它。

我保留并检查的其他一些信息是与认证cookie一起使用的。

  1. 会话cookie与身份验证Cookie相关联。
  2. 浏览器ID与
  3. 相关联
  4. 用户的IP已与
  5. 连接
  6. 必须启用Javascript
  7. 我知道有人可以说所有可以被黑客克隆的东西 - 如果黑客可以拿走cookie,为什么不能和其他人一起。没有什么是在场景中100%保证,如果有人可以获取所有信息,实际上可以拥有和密码自己和登录 - 至少你让它更安全一点。

答案 2 :(得分:1)

您已经在使用HTTPS并加密Cookie,这是非常安全的。

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

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