Hir*_*duk 13 c# asp.net session session-state
是否可以在Asp.Net Web应用程序中仅允许每个用户进行一次并发登录?
我正在开发一个Web应用程序,我希望确保该网站每个用户一次只能登录一次.如何检查当前用户是否已登录.
建议正确的登录方法,以便我们处理这个问题.我认为我们应该使用sql server session state来处理这个问题.你的建议是什么?
我想到了一个解决方案.我不知道它是否合适.我们可以这样做:
当用户登录系统时,我们在用户列中插入会话ID.(我们将使用数据库会话,以便我们可以轻松获取所有与会话相关的数据,如isexpired,expiredatetime等).
当同一用户尝试第二次登录时,我们将检查该会话ID列并检查该会话是否已过期.如果会话未过期,我们将不允许用户登录.
每次用户注销时更新用户会话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);
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)