2014-02-19 46 views
2

我正在为一个大学项目的网站工作。我想添加一个功能到我的项目网站。在asp.net中单一登录

当用户登录到网站时,应该注销同一用户帐户的所有其他登录,即每次只允许一个帐户登录。

当相同的用户ID试图登录到多个设备上时,如何终止其他设备上的会话?

+0

请你澄清,假设用户A登录,现在如果另一个用户B登录到该网站,那么用户A将自动登出? – Gerry

+0

如果用户A从某个地方X登录,然后再次登录表单地点Y,则从A登录应该被注销。 – user2788596

+1

请提供更多信息。你有什么尝试?什么没有用?这个问题是不可回答的,因为它是 – Martijn

回答

0

你可以出了状况做这样的事情:

理念

每当自己的帐户用户登录我们存储他们的用户名与他们的会话ID一起。下一次登录的人尝试提出请求时,我们检查他们的会话ID是否与我们为他们存储的会话ID匹配。如果它不匹配,那就意味着有其他人登录了!因此我们可以安全地注销它们。

的实施

我们将利用3件事情。 会话ID:让我们来区分人的浏览情况

的Global.asax:抢会话结束事件

一个存储位置:

HttpContext.Current.Application

数据库

如果您的网站在一台服务器上运行,那么您可以使用应用程序,但如果您的网站运行在多个服务器上,则必须使用数据库。该代码显示它正在为应用程序完成。 当您的用户登录需要存储的会话ID:

UserAccout ua = GetUserAccount(); 
HttpContext.Current.Application["usr_" + ua.UserName] = HttpContext.Current.Session.SessionID; 

当他们退出,我们需要清除它:

UserAccout ua = GetUserAccount(); 
    HttpContext.Current.Application.Remove("usr_" + ua.UserName); 

在您的Global.asax文件,你应该调用相同退出代码清理时,他们的会话结束

void Session_End(object sender, EventArgs e) 
{ 
UserAccout ua = GetUserAccount(); 
if (ua != null) 
{ 
HttpContext.Current.Application.Remove("usr_" + ua.UserName); 
} 
} 

现在,我们需要实际检查用户是否应被踢出或没有,所以在所有的REQ的开始执行此美国:

UserAccout ua = GetUserAccount(); 
if (!HttpContext.Current.Application["usr_" + ua.UserName].Equals(HttpContext.Current.Session.SessionID)) 
{ 
Logout(); 
HttpContext.Current.Response.Redirect("SignOut.aspx"); 
}