0

我有一个应用程序,我阻止同一用户多次登录。如果用户尝试从另一个网页/机器登录(当已经登录另一个),则会出现一个确认框,询问他是否需要注销上一个会话,如果他单击“是”,然后以前的会话将被注销。我无法注销上一个会话,但是代码阻止了多次登录,但是我如何注销上一个会话 n 将用户重定向到当前会话的主页

这是
loginButton_Click 中的代码(身份验证后)

    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;
    }

在 Global.asax 页面中

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);
            }
        }
    }
}
4

1 回答 1

0

您当前使用的方法是有问题的。您保留相同的“密钥” ( loginControl.UserName + loginControl.Password) 来标识用户的会话,而不是每个会话的唯一密钥(Guid.NewGuid()例如)。
如果您有唯一的密钥,您将能够区分一个会话和另一个会话(例如,如果用户执行两次登录,您将能够知道哪个是哪个)

说明:
当用户登录时,创建一个新的 Guid 并将其保存在另一个 Session 密钥中(Session["SessionGuid"] = Guid.NewGuid()例如)。
此外,要么保留一个字典(或在全局缓存中为每个用户创建一个单独的条目),其中每个 userId 保存唯一的 Guid。
由于在一个会话中您将拥有旧的 Guid,而在新的会话中您将拥有新的 Guid,您可以检查Application_PreRequestHandlerExecute当前会话具有的 Guid,如果不匹配 - 断开用户连接。

于 2013-01-02T13:16:38.067 回答