在Asp.net中每个用户只能进行一次并发登录

是否可以在Asp.Net Web应用程序中仅允许每个用户进行一次并发登录?

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

建议正确的登录方法,我们可以通过它来处理这个问题 我认为我们应该使用sql server session state来处理这个问题。 你的建议是什么?

我想到了一个解决方案。 我不知道它是否合适。 我们可以这样做:

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

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

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

请以正确的方式建议。

请参阅:

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

开箱即用,.NET不支持这一点。 .NET允许并发登录,因为我相信你已经知道了。

我有同样的要求,并提出了一个非常光滑的解决方案,在上面的链接中演示。 简而言之,我的要求是一次只能有一个用户登录。 如果同一个用户ID尝试在其他地方登录,则会通过检查不同会话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中,因此要知道用户是否已登录,您需要在服务器保留此信息 ,因为数据库可能是Web园或Web场中唯一常见的位置。

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

因此,假设用户A已登录,然后您在该数据库的数据库上打开一个标志,该标志现在已登录,如果再次尝试再次登录,则会让他退出。 为了完成这项工作,您需要向用户说出注销或保持超时,类似于凭据的超时时间。

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