「ログアウト」を押すと、FormsAuthentication.SignOut()
を呼び出すlogin.aspx
メソッドを持つPage_Load
ページにリダイレクトするページがあります。
マスターページの画面右上に「ログアウト」リンクが表示され、Page.User.Identity.IsAuthenticated
がtrue
であるという条件でリンクが表示されます。ただし、コードをステップ実行した後、このサインアウトメソッドはIsAuthenticated
をfalse
に自動的に設定しません。
_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
を確認できます。
個人は、リクエストごとに1回だけ認証されます。 ASP.NETが認証されているかどうかを判断すると、その要求の残りの部分では変更されません。
たとえば、誰かがログインしたとき。ログインしていることを示すフォーム認証Cookieを設定すると、同じリクエストで認証されているかどうかを確認すると、false
が返されますが、要求すると、true
を返します。誰かをログアウトするときにも同じことが起こります。それらはそのリクエストの期間中も認証されますが、次のリクエストでは認証されなくなります。そのため、ユーザーがログアウトするためにリンクをクリックした場合、ログアウトする必要がありますthenログインページへのリダイレクトを発行します。
同様の問題があったことを覚えていますが、ログアウト時にフォーム認証Cookieを期限切れにすることで解決したと思います。
FormsAuthentication.SignOut();
Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now.AddYears(-1);
Login.aspxでログアウトコードを実行しているのはなぜですか?
このコードをlogout.aspx:
FormsAuthentication.SignOut()
Session.Abandon()
FormsAuthentication.RedirectToLoginPage()
HttpContext.Current.ApplicationInstance.CompleteRequest()
return
IsAuthenticatedは、login.aspxでfalseになります。ログインとログアウトのコードが分離されました:単一の責任。
Login.aspx Page_Loadメソッドで:
if (!this.IsPostBack)
{
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
FormsAuthentication.SignOut();
Response.Redirect(Request.RawUrl);
}
}
資格情報を使用してサインインしているアプリケーションの1つで、アプリケーション内の別のフォームに移動してから、ナビゲートされたフォームのURLの1つをコピーし、アプリケーションからログアウトしました。検索タブで、ブラウザがログインせずにアプリケーションの特定のフォームに移動しているURLを貼り付けました。ログアウトしてもフォーム認証をpage.User.Identity.IsAuthenticated
としてチェックします。これの原因は、ログアウト時にセッションをクリアしているときです
Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now.AddYears(-1);
これにより、この問題が再び発生することはなく、ログインせずにアプリケーション内のさまざまなフォームに移動しているときに、フラグpage.User.Identity.IsAuthenticated
がfalseになります。
私の答えは多くの人々とうまくいかなかったというコメントを受け取りました。私は2011年に耳を引き裂いてこの回答を書きました。それで問題が解決したと確信しています。
私はこの6年前の問題を調査し始めました この解決策になりました これはクッキーを削除する適切な方法であると信じています。
これは私のために働く
public virtual ActionResult LogOff()
{
FormsAuthentication.SignOut();
foreach (var cookie in Response.Cookies.AllKeys)
{
Response.Cookies.Remove(cookie);
}
return RedirectToAction(MVC.Home.Index());
}