登录安全性:如何禁用多次登录

时间:2012-10-19 08:16:03

标签: c# asp.net-mvc asp.net-mvc-2 authentication

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

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

5 个答案:

答案 0 :(得分: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身份验证令牌本身,但我不确定这是否可行。

谷歌搜索没有给我什么。

答案 1 :(得分:1)

一切都不理想,但在SignInLockTime位字段旁边添加login_status字段,并在更新登录状态时写下更新登录状态的时间。从那里你可以有一个应用程序配置的超时,所以如果timeout时间已经过SignInLockTime,你可以自动解锁。

答案 2 :(得分:1)

从您对问题的回答中,您实际想要做的是阻止用户同时从两个位置登录......这是正确的吗?

如何将会话ID存储在数据库中的用户记录中。用户登录时,替换数据库中的会话ID。在每个授权请求中,然后检查提供的会话ID与存储在用户记录中的会话ID - 如果它不同,则会将其登录到其他位置,因此请将它们再次重定向到登录页面。这样,可以在其他计算机上登录,但由于新登录,其他计算机上的现有会话将失效。

答案 3 :(得分:1)

请参阅:

When the same user ID is trying to log in on multiple devices, how do I kill the session on the other device?

开箱即用,.NET不支持此功能。 .NET允许并发登录,因为我确定你知道。

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

当然,它可能不适合您所需要的100%,所以请随意修改它以满足您的需求。

答案 4 :(得分:-2)

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