繁体   English   中英

每个用户在ASP.NET中仅允许一次并发登录

[英]Allow only one concurrent login per user in ASP.NET

在ASP.NET Web应用程序中,每个用户只能允许一个并发登录吗?

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

请提出适当的登录方法以解决此问题。 我认为我们应该使用SQL Server会话状态来处理此问题。 你有什么建议?

我想到了一个解决方案。 我们可以做类似的事情:

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

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

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

请提出这是否正确的方法。

请参阅:

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

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

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

当然,它可能无法100%地满足您的需求,因此可以随时对其进行修改以满足您的需求。

您可以为每个用户创建一个缓存条目,并将其会话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);

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

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

但是请注意,除非使用者主动注销,否则您无法知道用户何时移动到其他地方(进入其他网站或关闭浏览器等),因此您需要设置某种会话超时,该会话将自动注销在指定时间段内没有新请求的用户。

这意味着,例如,如果用户关闭浏览器并尝试登录移动设备,则在您指定的会话超时用尽之前,他/她将无法登录,因此请在您超时时考虑一下不想让用户快速注销(如果他/她正在阅读长页面等),并且您不希望用户忘记了几个小时也无法登录另一台设备在离开家之前注销。

登录凭据存储在cookie上,因此要知道用户是否已登录,您需要将此信息保存在server上(最好在数据库上),因为该数据库可能是web garden或web farm中唯一的常用位置。

您可以在表上保留user A是否登录,在表中将其标记为注销,最后一次用户交互具有超时等信息。

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

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

解决方法可以是这样的:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM