【问题标题】:Can I make my ASP.NET FormsAuthentication cookie more secure by associating it with the session ID?我可以通过将 ASP.NET FormsAuthentication cookie 与会话 ID 相关联来使其更安全吗?
【发布时间】:2009-08-18 17:43:18
【问题描述】:

我们注意到可以在另一台计算机上重新创建 ASP.NET FormsAuthentication cookie 的副本,从而允许第二台计算机无需登录即可进行身份验证。

对此的一个建议解决方案是将会话 ID 存储在 FormsAuthenticationTicket.UserData 中,并检查两个值在 Application_AuthenticateRequest() 中是否匹配。

我们正在使用:

FormsAuthenticationTicket.IsPersistent = false;

这种将 FormsAuthentication cookie 与会话 ID 相关联的方法是个好主意吗?

【问题讨论】:

  • 这是您实际尝试过的东西吗?您实际上已经让另一台机器使用来自另一台机器的 cookie 登录?我认为有一些每会话加密。
  • 同事试过了。不知道有没有配置加密。

标签: asp.net security cookies forms-authentication


【解决方案1】:

我认为你想多了这个问题。复制 cookie 的能力只是 cookie 的一个固有问题 - 任何人都可以拦截任何 cookie 并通过在另一台机器上设置它来模拟其中的任何数据。

身份验证 cookie 的“安全性”来自这样一个事实,即没有人可以(据说)手工制作 cookie 来伪造经过身份验证的用户。但是,一旦创建了 cookie,它当然可以用于身份验证。这意味着,为了让您的“问题”发生,您仍然需要先有一个有效的用户登录。如果该用户滥用系统,将他的 cookie 复制到其他机器以授予每个人访问权限,这与用户只是告诉每个人她的用户名和密码完全相同,只是更加迟钝。因此,问题不在于 cookie 的复制——而是用户自己。

另一个攻击向量是如果网络受到破坏,并且有人可以拦截流量以通过嗅探器或其他方式将 cookie 拼凑在一起 - 但同样,这是 cookie 本身固有的。这称为会话劫持,防止这种情况的唯一方法是为您的网站使用 SSL。

如果您真的担心,我只需将您的身份验证和会话超时设置为相同,然后在您的 global.asax 文件中,只要用户会话到期,只需调用 FormsAuthentication.Signout() 即可。每当用户完成会话时,这会使身份验证无效,迫使他们稍后再次登录。当然,这可能会给您的用户带来极大的烦恼……

我也强烈推荐This MSDN article。它可能比我能更好地回答你的问题。

【讨论】:

  • 感谢您的回答 - 这实际上与我的想法一致,但在我尝试解决实际上不是问题的问题之前需要第二个意见。您建议的 FormsAuthentication.Signout() 似乎不适用于我的情况,因为身份验证 cookie 无论如何都会在会话结束时过期 - 强制用户登录每个新会话。还是我错过了什么?
  • 如果用户的计算机感染了窃取其 cookie 的病毒,情况会怎样? SSL 那时不会保护它们。我想这只是会话劫持的一种变体。
  • 回复:第一条评论。我不认为你错过了什么。昨晚我确实考虑了一些,并认为您可以尝试将一些用户数据设置到身份验证票证中,例如他们的 IP 地址或其他内容,如果该信息发生更改,则自动将其注销。这使得另一台机器更难模仿......但IP地址也可以被欺骗。不过,它会更安全一些。回复:第二条评论 - 是的,只是另一种变化。
猜你喜欢
  • 2011-10-03
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
  • 2014-09-24
  • 1970-01-01
  • 2012-09-05
  • 2016-11-08
相关资源
最近更新 更多