3

我正在尝试为我正在构建的 ASP.NET MVC 站点实现“记住我”登录功能。我正在尝试使用这种方法http://jaspan.com/improved_persistent_login_cookie_best_practice(请参阅顶部附近的“米勒设计”)并让它在一定程度上发挥作用。

因此工作流程是:

  1. 用户登录并获得加密安全随机字符串 + 他们的数据库 ID 作为持久 cookie(持续约 30 天)。安全字符串存储在他们的用户帐户记录旁边的数据库中。
  2. 用户稍后返回浏览器显示登录 cookie 的站点,在数据库中查找 ID 和安全密钥,如果找到匹配项,则自动对用户进行身份验证。
  3. 一旦经过身份验证,就会生成一个新的安全密钥,并将其存储在数据库中并发布新的 cookie。

我的工作正常,但是,如果用户从多个浏览器或计算机登录,它就不能很好地工作。显然,不同的浏览器最终会以不同的安全密钥存储为 cookie,因此工作流程变为:

  1. 用户从浏览器 A 登录,获得一个安全密钥作为 cookie,密钥存储在数据库中。
  2. 用户从浏览器 B 登录,将获得不同的安全密钥作为 cookie。密钥也存储在数据库中,但会覆盖从浏览器 A 生成的密钥。
  3. 用户再次从浏览器 A 访问站点,浏览器显示从步骤 1 发出的 cookie。但它不再匹配,因为在步骤 2 中替换了安全密钥。因此用户必须再次登录。生成另一个新密钥并覆盖颁发给浏览器 B 的密钥。
  4. 用户再次从浏览器 B 访问,密钥不匹配,必须重新登录等。

我该如何解决这个问题?我需要在数据库中存储和维护多个密钥吗?我是否以正确的方式去做这件事?我注意到 StackOverflow 似乎可以管理这个并从不同的浏览器和计算机中记住我。

4

2 回答 2

1

通过阅读您链接的文章,在我看来,米勒的设计是将随机字符串和用户名作为一对存储在与用户表不同的表中。通过使用随机字符串作为索引,您可以从同一个用户名同时进行多个登录,同时仍然可以很好地防止会话劫持。

您的描述表明您将随机字符串存储在用户表中,当时只允许一次登录。

于 2010-11-17T09:34:37.500 回答
0

您需要 cookie 中的第三个项目,即“系列”令牌。这将代表一个登录事件。每次用户登录到您的系统时,它都会创建一个新系列,在他们注销或再次登录之前不会更改。您仍然拥有您的令牌,即安全密钥,它会根据每个请求进行更新。

以下是一些有助于此实现的链接:

允许多个浏览器持久登录时的数据库问题

基于表单的网站身份验证权威指南

于 2012-07-06T04:30:58.610 回答