Asp.net 如果同一用户多次登录,则强制注销所有其他会话
我有一个应用程序,其中im阻止同一用户多次登录。如果用户尝试从另一个网页/计算机登录(当已登录另一个网页/计算机时),则会出现一个确认框,询问他是否需要注销上一个会话,如果他单击“是”然后以前的会话将被注销。我无法注销以前的会话,但是代码阻止了多次登录,但是我如何注销以前的会话n将用户重定向到当前会话的主页 这是代码Asp.net 如果同一用户多次登录,则强制注销所有其他会话,asp.net,session,global-asax,Asp.net,Session,Global Asax,我有一个应用程序,其中im阻止同一用户多次登录。如果用户尝试从另一个网页/计算机登录(当已登录另一个网页/计算机时),则会出现一个确认框,询问他是否需要注销上一个会话,如果他单击“是”然后以前的会话将被注销。我无法注销以前的会话,但是代码阻止了多次登录,但是我如何注销以前的会话n将用户重定向到当前会话的主页 这是代码 在登录按钮中单击(验证后) 您当前使用的方法存在问题。您可以保留相同的“密钥”(loginControl.UserName+loginControl.Password)来标识用户的
在登录按钮中单击(验证后)
您当前使用的方法存在问题。您可以保留相同的“密钥”(
loginControl.UserName+loginControl.Password
)来标识用户的会话,而不是每个会话的唯一密钥(Guid.NewGuid()
)
如果您有唯一的密钥,您将能够区分一个会话和另一个会话(例如,如果用户执行两次登录,您将能够知道哪个是哪个)
解释:当用户登录时,创建一个新的Guid并将其保存在另一个会话密钥中(
Session[“SessionGuid”]=Guid.NewGuid()
。此外,您可以保留一个字典(或为全局缓存中的每个用户创建一个单独的条目),其中每个用户标识都保存唯一的Guid。
由于在一个会话中您将使用旧Guid,而在新会话中您将使用新Guid,因此您可以在
应用程序中检查当前会话使用的Guid,如果不匹配,请断开用户连接。请使用IDE和编辑器中的“代码”按钮正确连接。Blachshma非常感谢您的回复。但是如何注销/清除上一个会话(而不是当前会话)并继续当前登录。我是一个新手,因此请指导。上一个会话与当前Guid不匹配
string sKey = loginControl.UserName + loginControl.Password;
string sUser = Convert.ToString(Cache[sKey]);
if (sUser == null || sUser == String.Empty || sUser == "")
{
TimeSpan SessTimeOut = new TimeSpan(0, 0, HttpContext.Current.Session.Timeout, 0, 0);
HttpContext.Current.Cache.Insert(sKey, sKey, null, DateTime.MaxValue, SessTimeOut, System.Web.Caching.CacheItemPriority.NotRemovable, null);
Session["user"] = loginControl.UserName + loginControl.Password;
Response.Redirect("MainPage.aspx");
}
else
{
Response.Write("<script>if(window.confirm('You have already Logged In.Do you want to sign off the previous Session?')){} else{window.location.href='login.aspx'}</script>");
//if part
return;
}
protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
{
if (System.Web.HttpContext.Current.Session != null)
{
if (Session["user"] != null)
{
string sKey = (string)Session["user"];
string sUser = (string)HttpContext.Current.Cache[sKey];
}
else
{
foreach (DictionaryEntry de in HttpContext.Current.Cache)
{
HttpContext.Current.Cache.Remove((string)de.Key);
}
}
}
}