1

我想在我的网站上禁用多次登录。例如,当用户已经登录系统时。系统应禁止用户在其他浏览器或计算机上再次登录。目前我尝试通过使用数据库来做到这一点。我有一个像 login_status 这样的列,一旦用户登录,它将更新为 1 和 0 以表示离线。如果您的用户关闭浏览器而不注销。它将保持登录状态,用户应要求管理员将其注销。问题是我们希望在最多 30 分钟的空闲时间内自动注销用户。我很难做到这一点。

有没有办法禁用多次登录并确定用户是否空闲并自动将他注销?我正在考虑cookies和会话。

4

5 回答 5

4

访问者可以同时从多个位置登录的原因是,每当他们登录时,ASP.net 都会为他们分配相同的身份验证令牌。因此,身份验证令牌本身不允许您区分用户登录的位置。

可能有很多方法可以解决这个问题,但原则上您需要做的就是在用户的会话状态中存储一些识别信息,并在每个请求中检查这些信息。例如,当他们登录时,他们的 IP 地址可以存储为会话数据。然后对于每个后续经过身份验证的请求,可以将请求来自的 IP 与当前请求的 IP 进行比较。如果两者不匹配,则将用户注销。

或者,如果 IP 不是一个足够好的标识符(例如,如果用户从路由器后面登录,多台 PC 将共享 IP),那么您可以在登录时将一些识别信息添加到用户身份验证令牌。这是有关如何执行此操作的教程:

http://www.danharman.net/2011/07/07/storing-custom-data-in-forms-authentication-tickets/

每次他们登录时,都可以生成一个唯一的 GUID,并将其存储为会话数据和身份验证令牌的一部分。在每个请求上,您都会比较两者,在失败时将用户注销。

这是几种可能性——我敢肯定还有其他可能性。

更好的方法可能是在 asp.net 生成它以引入一些更改时影响 asp.net 身份验证令牌本身,但我不确定这是否可能。

谷歌搜索什么也没给我。

于 2013-02-22T17:28:07.240 回答
1

不是很理想,而是在位SignInLockTime字段旁边添加一个字段login_status,并在更新登录状态的同时写入更新登录状态的时间。从那里你可以有一个应用程序配置的超时,所以如果timeout时间过去了,SignInLockTime你可以自动解锁。

于 2012-10-19T08:20:51.203 回答
1

从您对问题的回答来看,您实际上想要做的是防止用户同时从两个位置登录......对吗?

如何根据数据库中的用户记录存储会话 ID。当用户登录时,替换数据库中的会话 id。然后,在每个授权请求上,您将提供的会话 ID 与存储在用户记录中的会话 ID 进行检查 - 如果不同,则他们在其他地方登录,因此再次将它们重定向到登录页面。这样,其他机器上的登录是可能的,但其他机器上的现有会话将因新登录而失效。

于 2012-10-19T09:44:04.007 回答
1

请参阅:

当同一个用户 ID 尝试在多台设备上登录时,如何终止另一台设备上的会话?

开箱即用,.NET 不支持这一点。.NET 允许并发登录,我相信您知道。

我有同样的确切要求,并提出了一个非常巧妙的解决方案,如上面的链接所示。简而言之,我的要求是一次只能有一个用户登录。如果同一个用户 ID 试图在其他地方登录,那么它会通过检查不同会话 ID 下的现有登录来终止第一次登录的会话(这使得用户 ID 可以从其多个实例登录)计算机上的网络浏览器 [相同的会话 ID],这很常见,但不是来自不同的计算机 [不同的会话 ID](例如,可能是由于某人窃取了他们的凭据))。通过修改代码,您可能会改变它的行为 - 即,阻止第二次登录尝试,而不是杀死已经处于活动状态且正在使用的第一次登录。

Of course, it may not fit 100% to what you're needing, so feel free to modify it to fit your needs.

于 2013-07-08T14:00:14.177 回答
-2

一个简单(但不好)的选项是在 Session_End 结束事件上注销用户。但我不确定这是一个不错的选择。

于 2012-10-19T08:26:32.593 回答