“记住我”登录网站 - 不同浏览器/计算机的问题

时间:2010-11-17 09:26:27

标签: asp.net-mvc authentication login remember-me autologin

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

因此工作流程是:

  1. 用户登录并发出加密安全随机字符串+其数据库ID作为持久性cookie(持续约30天)。安全字符串存储在用户帐户记录旁边的数据库中。
  2. 用户稍后返回浏览器显示登录cookie的站点,在数据库中查找ID和安全密钥,如果找到匹配,则会自动对用户进行身份验证。
  3. 一旦经过身份验证,就会生成一个新的安全密钥,存储在数据库中并发布新的cookie。
  4. 我有这个工作正常,但是,如果用户从多个浏览器或计算机登录,它不能很好地工作。显然,不同的浏览器最终会将不同的安全密钥存储为cookie,因此工作流程变为:

    1. 用户从浏览器A登录,以cookie作为安全密钥,密钥存储在数据库中。
    2. 用户从浏览器B登录,会以cookie的形式发出不同的安全密钥。密钥也存储在数据库中,但会覆盖从浏览器A生成的密钥。
    3. 用户再次从浏览器A访问网站,浏览器显示从步骤1发出的cookie,但由于安全密钥在步骤2中被替换,因此不再匹配,因此用户必须再次登录。生成另一个新密钥并覆盖发布到浏览器B的密钥。
    4. 用户再次从浏览器B访问,密钥不匹配,必须再次登录等。
    5. 我该如何解决这个问题?我是否需要在数据库中存储和维护多个密钥?我是否正确地走这条路?我注意到StackOverflow似乎管理这个,并记住我来自不同的浏览器和计算机。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

Database problems when allowing multiple browser persistent log ins

The definitive guide to form-based website authentication

相关问题