“记住我”登录网站 - 不同浏览器/计算机的问题
-
25-09-2019 - |
题
我正在尝试为我正在构建的 ASP.NET MVC 站点实现“记住我”登录功能。我正在尝试使用这种方法 http://jaspan.com/improved_persistent_login_cookie_best_practice (参见顶部附近的“米勒的设计”)并使其在一定程度上发挥作用。
因此工作流程是:
- 用户登录后会收到一个加密安全随机字符串 + 他们的数据库 ID 作为持久 cookie(持续约 30 天)。安全字符串存储在数据库中用户帐户记录旁边。
- 用户稍后返回浏览器显示登录 cookie 的站点,在数据库中查找 ID 和安全密钥,如果找到匹配,则自动对用户进行身份验证。
- 一旦通过身份验证,就会生成新的安全密钥,并将其存储在数据库中并发出新的 cookie。
我的工作正常,但是,如果用户从多个浏览器或计算机登录,它就不能很好地工作。显然,不同的浏览器最终会使用存储为 cookie 的不同安全密钥,因此工作流程变为:
- 用户从浏览器A登录,获得一个安全密钥作为cookie,密钥存储在数据库中。
- 用户从浏览器 B 登录,会获得与 cookie 不同的安全密钥。密钥也存储在数据库中,但会覆盖浏览器 A 生成的密钥。
- 用户再次从浏览器A访问站点,浏览器呈现步骤1中发出的cookie。但它不再匹配,因为安全密钥在步骤 2 中被替换。所以用户必须重新登录。生成另一个新密钥并覆盖颁发给浏览器 B 的密钥。
- 用户再次从浏览器B访问,密钥不匹配,需要重新登录等。ETC。
我该如何解决这个问题?我需要在数据库中存储和维护多个密钥吗?我是否以正确的方式处理这件事?我注意到 StackOverflow 似乎可以管理这个问题,并从不同的浏览器和计算机上记住我。
解决方案
通过阅读您链接的文章,在我看来,米勒的设计是将随机字符串和用户名作为一对存储在与用户表不同的表中。通过使用随机字符串作为索引,您可以使用同一用户名同时进行多个登录,同时仍然可以很好地防止会话劫持。
您的描述表明您将随机字符串存储在用户表中,该表一次只允许一次登录。
其他提示
您的 cookie 中需要第三个项目,即“系列”标记。这将代表一个登录事件。每次用户登录您的系统时,它都会创建一个新系列,该系列不会更改,直到他们注销或再次登录。您仍然拥有令牌,即安全密钥,它会根据每个请求进行更新。
以下是一些有助于实现此实施的链接:
不隶属于 StackOverflow