web-dev-qa-db-ja.com

Page.User.Identity.IsAuthenticatedは、FormsAuthentication.SignOut()の後も引き続きtrueです

「ログアウト」を押すと、FormsAuthentication.SignOut()を呼び出すlogin.aspxメソッドを持つPage_Loadページにリダイレクトするページがあります。

マスターページの画面右上に「ログアウト」リンクが表示され、Page.User.Identity.IsAuthenticatedtrueであるという条件でリンクが表示されます。ただし、コードをステップ実行した後、このサインアウトメソッドはIsAuthenticatedfalseに自動的に設定しません。

61
lisburnite

_Page.User.Identity.IsAuthenticated_は、(明らかに)_Page.User_から値を取得しますが、残念ながら読み取り専用であり、FormsAuthentication.SignOut()を呼び出しても更新されません。

幸いなことに_Page.User_は、変更可能な_Context.User_から値を取得します。

_// HttpContext.Current.User.Identity.IsAuthenticated == true;

FormsAuthentication.SignOut();
HttpContext.Current.User =
    new GenericPrincipal(new GenericIdentity(string.Empty), null);

// now HttpContext.Current.User.Identity.IsAuthenticated == false
// and Page.User.Identity.IsAuthenticated == false
_

これは、現在のユーザーをサインアウトし、リダイレクトを実行せずに実際のページで応答する場合に便利です。同じページリクエスト内で必要な場所でIsAuthenticatedを確認できます。

98
Mart

個人は、リクエストごとに1回だけ認証されます。 ASP.NETが認証されているかどうかを判断すると、その要求の残りの部分では変更されません。

たとえば、誰かがログインしたとき。ログインしていることを示すフォーム認証Cookieを設定すると、同じリクエストで認証されているかどうかを確認すると、falseが返されますが、要求すると、trueを返します。誰かをログアウトするときにも同じことが起こります。それらはそのリクエストの期間中も認証されますが、次のリクエストでは認証されなくなります。そのため、ユーザーがログアウトするためにリンクをクリックした場合、ログアウトする必要がありますthenログインページへのリダイレクトを発行します。

12
Brian Ball

同様の問題があったことを覚えていますが、ログアウト時にフォーム認証Cookieを期限切れにすることで解決したと思います。

FormsAuthentication.SignOut();
Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now.AddYears(-1);
6
PatrickSteele

Login.aspxでログアウトコードを実行しているのはなぜですか?

このコードをlogout.aspx:

FormsAuthentication.SignOut()
Session.Abandon()
FormsAuthentication.RedirectToLoginPage()
HttpContext.Current.ApplicationInstance.CompleteRequest()
return

IsAuthenticatedは、login.aspxでfalseになります。ログインとログアウトのコードが分離されました:単一の責任。

4

Login.aspx Page_Loadメソッドで:

if (!this.IsPostBack)
{
    if (HttpContext.Current.User.Identity.IsAuthenticated)
    {
        FormsAuthentication.SignOut();
        Response.Redirect(Request.RawUrl);
    }
}
1
James McCormack

資格情報を使用してサインインしているアプリケーションの1つで、アプリケーション内の別のフォームに移動してから、ナビゲートされたフォームのURLの1つをコピーし、アプリケーションからログアウトしました。検索タブで、ブラウザがログインせずにアプリケーションの特定のフォームに移動しているURLを貼り付けました。ログアウトしてもフォーム認証をpage.User.Identity.IsAuthenticatedとしてチェックします。これの原因は、ログアウト時にセッションをクリアしているときです

Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now.AddYears(-1);

これにより、この問題が再び発生することはなく、ログインせずにアプリケーション内のさまざまなフォームに移動しているときに、フラグpage.User.Identity.IsAuthenticatedがfalseになります。

1
Mike

更新

私の答えは多くの人々とうまくいかなかったというコメントを受け取りました。私は2011年に耳を引き裂いてこの回答を書きました。それで問題が解決したと確信しています。

私はこの6年前の問題を調査し始めました この解決策になりました これはクッキーを削除する適切な方法であると信じています。


これは私のために働く

public virtual ActionResult LogOff()
    {
        FormsAuthentication.SignOut();
        foreach (var cookie in Response.Cookies.AllKeys)
        {
            Response.Cookies.Remove(cookie);
        }
        return RedirectToAction(MVC.Home.Index());
    }
0
Korayem