我正在尝试为我正在构建的 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 访问,密钥不匹配,必须重新登录等。
我该如何解决这个问题?我需要在数据库中存储和维护多个密钥吗?我是否以正确的方式去做这件事?我注意到 StackOverflow 似乎可以管理这个并从不同的浏览器和计算机中记住我。