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

Hir*_*duk 13 c# asp.net session session-state

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

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

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

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

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

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

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

请以正确的方式建议.

Mik*_*rks 9

请参阅:

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

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

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

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


Tom*_*ala 5

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

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

(在没有语法检查的文本框中键入的代码.假设"伪代码".)

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

if(Cache.ContainsKey["Login_" + username])
    Cache.Remove("Login_" + username);
Run Code Online (Sandbox Code Playgroud)

  • @abatishchev缓存管理得更好,可以跨Web场或多个线程同步负载平衡等.其他(静态或应用程序)只在进程中,并且在这些情况下不保证单个对象.但是,如果情况不需要,您可以使用静态字典或应用程序对象. (3认同)