2

考虑使用持久 cookie 进行表单身份验证的情况。

如果同一用户使用两个不同的浏览器或两台不同的机器登录,当用户从其中一个浏览器/机器注销时,他仍然不能从另一台浏览器/机器登录吗?

通常,Web 应用程序如何处理这种情况?

4

3 回答 3

4

在很大程度上,我必须同意斯里尼瓦斯的观点。这是我对这个问题的看法

  1. 在登录时创建一个仅 HTTP cookie,并在登录时生成一个 guid,这将是您的浏览器/计算机密钥。关闭浏览器将删除 cookie
  2. 获取用户id
  3. 保留用户表中的对 ex: user:a, key:12345
  4. 用户通过身份验证后的后续请求身份验证算法
  5. 使用当前用户 ID 获取数据库中最后使用的密钥
  6. 检查 cookie 是否存在,如果不存在则完全取消身份验证
  7. 检查cookie值是否与数据库中的相同,如果不是则完全取消身份验证

使用此方法,任何后续登录都将导致所需的重新身份验证并使任何其他身份验证无效。实际上强制用户仅使用 1 个浏览器/计算机

于 2014-10-07T05:42:30.337 回答
1

我通常这样做:我的用户表中有一个会话列(在数据库中)当用户登录时,我将值Y存储在其中。当他注销时,我将其更改为N。每次用户尝试登录时在,我检查相应会话列中的值,如果是Y,我告诉用户他已经登录,如果是N,那么我允许用户登录。但是我们必须小心并设置值当用户注销或关闭浏览器时变为N。

于 2013-01-09T11:29:16.920 回答
0

带有 cookie 的表单身份验证(无论它们是否持久)是基于浏览器会话的(持久 cookie 当然可以跨同一浏览器的多个会话(在同一台机器上的同一用户帐户上)工作。所以两个浏览器会话(或两个不同的浏览器或两台机器上的浏览器等)就表单身份验证而言将被视为不同的范围。

因此用户可以从不同的浏览器会话进行多次登录,并且其中一个注销不会影响另一个。是否允许同一用户的多个并发登录取决于 Web 应用程序。例如,在线银行网站将限制为只有一个用户会话 - 因此,如果用户从不同的会话登录,则之前的会话无效(即用户已注销)。必须在 ASP.NET 中编写自定义实现才能做到这一点 - 典型的实现会使每个用户会话条目进入数据库(通常无论如何都需要用于审计目的) - 所以每当添加新条目时,都会检查是否有任何同一用户的活动会话,如果是,则该会话被标记为非活动。每个请求都会检查当前用户会话是否处于活动状态,如果没有,则会将此类消息标记给用户。

于 2013-01-09T11:25:24.510 回答