13

是否可以在 ASP.NET Web 应用程序中只允许每个用户同时登录一次?

我正在开发一个 Web 应用程序,我想确保该网站一次只允许每个用户登录一次。如何检查当前用户是否已经登录?

请建议我们可以处理此问题的正确登录方法。我认为我们应该使用 SQL Server 会话状态来处理这个问题。你有什么建议?

我想到了一种解决方案。我们可以这样做:

  1. 当用户登录系统时,我们在用户列中插入会话 ID。(我们将使用数据库会话,以便我们可以轻松获取所有与会话相关的数据,例如 isexpired、expiredatetime 等)。

  2. 当同一用户再次尝试登录时,我们将检查该会话 id 列并检查会话是否已过期。如果会话没有过期,那么我们将不允许用户登录。

  3. 每次用户注销时更新用户会话 ID。

请建议这是否是正确的方法。

4

6 回答 6

9

请参阅:

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

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

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

当然,它可能无法 100% 满足您的需求,因此请随意修改它以满足您的需求。

于 2013-07-08T02:28:11.447 回答
5

您可以为每个用户创建一个缓存条目并将他们的会话 ID 存储在其中。每个浏览器会话的会话 ID 都是唯一的。在您的登录页面中,您可以在他们成功登录时创建该缓存条目:

if(Cache.ContainsKey["Login_" + username])
    // Handle "Another session exists" case here
else
    Cache.Add("Login_" + username, this.Session.SessionID);

(在文本框中输入的代码没有语法检查。假设“伪代码”。)

然后,在 global.asax 中,您可以挂接到 Session_End 并过期用户的缓存条目。有关global.asax 事件,请参阅此内容。

if(Cache.ContainsKey["Login_" + username])
    Cache.Remove("Login_" + username);
于 2013-07-07T20:08:47.170 回答
2

您可以在用户表中添加一个标志列,指示用户当前已登录。

当用户尝试登录时,您检查标志是否为真(该用户帐户当前已被使用)然后您不允许新用户登录,如果标志为假,则允许用户在那里登录帐户目前没有被其他人使用。

请注意,除非用户主动注销,否则您无法知道用户何时转到其他内容(转到不同的网站或关闭浏览器等),因此您需要设置某种会话超时,以自动注销如果在指定时间段内没有新请求,则用户。

这意味着如果用户关闭他/她的浏览器并尝试在移动设备上登录,他/她将无法登录,直到您指定的会话超时时间用完,所以请考虑一下超时时间不希望用户快速退出(如果他/她正在阅读长页面等),并且您不希望用户在忘记时无法在其他设备上登录数小时在离开家之前注销。

于 2013-07-07T20:25:05.647 回答
1

登录凭据存储在 cookie 中,因此要知道用户是否登录,您需要将此信息保存在服务器上,最好保存在数据库中,因为数据库可能是网络花园或网络农场中唯一常见的地方。

您可以保留的内容是在桌子上,是否user A已登录,标记已注销,可能是最后一次用户交互超时,等等...

因此,假设用户 A 已登录,然后您在数据库上为该用户打开一个标志,该用户现在已登录,如果尝试再次登录,则将他拒之门外。要完成这项工作,您需要告诉您的用户注销或保持超时,类似于凭据的超时。

于 2013-07-07T20:15:00.797 回答
1

如果您使用身份系统,此链接将帮助您如何在多个设备上进行单用户登录。 防止在 Asp.Net 身份中多次登录 我已经尝试过它们在我的 Asp.net Mvc 项目中工作正常。

于 2017-10-18T06:01:50.827 回答
0

解决方案可以是这样的:

在登录表中添加新列GuidCode
第 1 步:登录时检查GuidCodein 数据库是否为null.
第 2 步GuidCode通过新的 guid 更新并将其存储在会话中。
第 3 步:如果不是null,则从会话中获取 guid 并与数据库GuidCode值进行比较。
第 4 步:如果相同,则允许登录:

于 2019-10-21T05:53:14.973 回答