0

同じユーザーによる複数のログインを防止するアプリケーションがあります。ユーザーが別の Web ページ/マシンからログインしようとすると (既に別の Web ページにログインしている場合)、前のセッションをログアウトする必要があるかどうかを確認するボックスが表示されます。 「はい」をクリックすると、以前のセッションはログオフされます。以前のセッションをログアウトできませんが、コードが複数のログインを妨げていますが、以前のセッションをログオフして、現在のセッションでユーザーをメインページにリダイレクトするにはどうすればよいですか


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の代わりに、ユーザーのセッションを識別するために同じ「キー」( ) を保持します。 一意のキーを持っている場合、あるセッションを別のセッションと区別できます (たとえば、ユーザーが 2 回ログインを実行した場合、どれがどれであるかを知ることができます)。Guid.NewGuid()

説明:
ユーザーがログインすると、新しい Guid を作成し、それを別のセッション キー (Session["SessionGuid"] = Guid.NewGuid()たとえば) に保持します。
さらに、userId ごとに一意の Guid を保存する辞書を保持する (またはグローバル キャッシュ内のユーザーごとに個別のエントリを作成する) こともできます。
あるセッションでは古い Guid が使用され、新しいセッションでは新しい Guid が使用されるためApplication_PreRequestHandlerExecute、現在のセッションの Guid を確認し、一致しない場合はユーザーを切断します。

于 2013-01-02T13:16:38.067 に答える