7

フォームの認証を使用するアプリがあり、ユーザーがログインすると、ユーザーの実際の名前を取得して、次のようにセッション変数に割り当てます。

[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        if (Membership.ValidateUser(model.UserName, model.Password))
        {
            Session["Name"] = client.GetName(model.UserName);
            FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
            return RedirectToAction("Index", "Home"); 
        }
    }
}

これは、次のようにインデックスビューに表示されます。

<h3>Welcome, @Session["Name"]</h3>

したがって、私の名前がBobの場合、ビューに「Welcome、Bob」と出力され、これは正常に機能します。しかし、ページから移動するか、ブラウザを閉じて数分後に戻ると、「ようこそ」と出力されるだけなので、これらのセッション変数が破棄されたように見えますが、まだログインしているので、セッションは破棄されませんか?web.configで60分後にセッションを破棄するように設定しました。

<sessionState regenerateExpiredSessionId="true" timeout="60" />

編集

これは、ログイン時に[Remember Me]ボックスをオンにした場合にのみ発生します。これは、Cookieクライアント側を保持しているため、ブラウザを再度開いたときに、ログインしたままですが、新しいセッションIDが作成されResponse.Write(Session.SessionID)ます。ブラウザを閉じる前のインデックスページとIDは、再度開いたときのものとは異なります。[Remember Me]チェックボックスをオンにしないと、ブラウザを再度開いたときに再度ログインする必要があります

4

5 に答える 5

5

セッション変数についても同じ問題がありました。ログオン時に[記憶する]オプションが選択された場合、コードをバイパスして、次にユーザーがサイトにアクセスするときに必要なセッション変数を設定します。

IsAuthenticatedがtrueの場合、セッション変数を再入力することで問題を解決できました。

protected void Session_Start(object sender, EventArgs e)
{
    if (User.Identity.IsAuthenticated)
    {
        Session["Name"] = client.GetName(User.Identity.Name);   
    }
}
于 2013-04-10T15:28:45.080 に答える
2

セッション変数に名前を追加する代わりに、以下を変更するだけです

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

FormsAuthentication.SetAuthCookie(client.GetName(model.UserName), model.RememberMe);

その後、@Session["Name"]の代わりにUser.Identity.Nameを使用できます。

于 2013-05-21T21:45:14.560 に答える
0

あなたが持っている問題はラインにあります

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

これはCookieであり、セッションよりも長く続きます(フォームのタイムアウトを設定した時間によって異なります)

ユーザー名を表示するだけでよい場合は、セッションを使用して完全に削除できます。

<h3>Welcome, @User.Identity.Name</h3>
于 2012-04-12T12:10:33.580 に答える
0
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

このコードは正常に機能し、タブ"Welcome USERNAME"などのIE設定 がチェックされているかどうかを確認できるはずです。(同じタブで削除ボタンをクリックすると、Cookieのクリアも表示されるため、問題が発生する可能性があります)。tools-->internet options-->Generaldelete my browsing history

ブラウザを閉じても、session(inproc)変数は閉じない場合、Cookieの値は保持されます。

于 2012-04-12T12:17:21.337 に答える
0

たぶん、最初に新しいセッションが何らかの形で開始されていないことを確認してください。ファイルSession_Start内のにブレークポイントを配置します。global.asax.cs

protected void Session_Start(object sender, EventArgs e)
{
    var sessionId = Session.SessionID; // break here
}

ばかげているように見えるかもしれませんが、実際に新しいセッションを引き起こす可能性のあることがいくつかあります。それらを排除することで、解決策に近づくことができます。

ブラウザを閉じて再度開くと、新しいセッションが発生する可能性があります。サイト内のフォルダー構造を変更し、web.configを変更すると、新しいセッションが発生します(アプリケーションプールはリサイクルされます)。

于 2012-04-13T07:05:26.903 に答える