2010-12-08 13 views
6

私はASP認証と統合Webサービスを使用しています。ASP ASPXAUTH認証Cookieがサイン/ログアウト時にクリアされない

ユーザーは、ログインページでフォーム認証を使用してログインします。
ログアウトするには、Silverlightから認証Webサービスを呼び出してログアウトします。

すべてうまくいきましたが、今ではIEが狂ってしまい、ユーザーをもうログアウトしません。

私はFiddlerを使用しましたが、認証サービスはSetCookieを返してASPXAUTH Cookieをクリアしますが、次の呼び出しではまだCookieが設定されています。
もちろん、Cookieが存在するため、ユーザーは認証され、ログインページに誘導されるのではなく、すぐにログインします。

問題の他の説明は確認していませんでした。 私はそれを再現することはできませんし、悪意のあるIEを持っている私の同僚は、1つの環境でうまく動作していて、他のものでは動作しません(1つはDEVの問題、もう1つはPreProdサーバの問題)。

何が起こっている可能性がありますか?

+0

一般的な問題の1つは、クッキーがあるコンテキストで設定され、別のコンテキストから削除しようとすることです。例えば。削除Set-Cookieヘッダーのパス属性とドメイン属性が元のSet-Cookie呼び出しの属性と正確に一致することを確認してください。 – EricLaw

+0

残念ながら、私が言ったように、私はそれを支配していません。 FormsAuthentication.RedirectFromLoginを呼び出してCookieを設定し、WebサービスのLogOutメソッドを呼び出します。 – R4cOON

答えて

2

この問題を回避するには、SignOutを作成した瞬間に、次の呼び出しがRedirect(pageLogOut、true)である必要があります。完全にリダイレクトされるまで他のアクティビティを停止します。パラメータtrueは非常に重要です。

SignOut()を呼び出した後、ブラウザがCookieデータをフラッシュするように強制する必要があります。なぜなら、認証が何らかの理由でCookieを再度要求すると、Cookieの有効期間が長くなり、あなたはSigntOutコマンドで尋ねます。

SignOutの後に、ページにリダイレクトするか、ブラウザにクッキーをフラッシュして、クッキーが完全に書き込まれるまでユーザーの認証と何かを再度尋ねないようにしてくださいブラウザ。

このヘルプが必要です。

+0

MSDNはfalseを指定してリダイレクトし、ThreadAbortExceptionを防ぐためにCompleteRequestを呼び出すことを推奨します。パフォーマンスにも言及していますが、テストしていません。 [MSDN - Response Redirect](http://msdn.microsoft.com/en-us/library/a8wa7sdt.aspx)から:endResponseパラメーターにtrueを指定すると、このメソッドは元の要求のEndメソッドを呼び出します。完了時にThreadAbortException例外がスローされます。この例外はWebアプリケーションのパフォーマンスに悪影響を及ぼします。そのため、endResponseパラメーターにfalseを渡すことをお勧めします。 –

+0

@CharlesByrne処理を停止しないと、予想外のクッキーがブラウザに書き込まれる可能性があります。 - 少し時間をかけてこれを読んでください。http://stackoverflow.com/a/14641145/159270 – Aristos

+0

これは、一般的な推奨事項ではありません。クッキーが他の場所のレスポンスに書き込まれている場合、その問題は取り組むべきではない。 –

4

私はこの問題を持っていた、と確認するために、ユーザーがログアウトします、今、私は次のコードを使用します。

 FormsAuthentication.SignOut(); 

     // Drop all the information held in the session 
     Session.Clear(); 
     Session.Abandon(); 

     // clear authentication cookie 
     HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, ""); 
     cookie1.Expires = DateTime.Now.AddYears(-1); 
     Response.Cookies.Add(cookie1); 

     // clear session cookie 
     HttpCookie cookie2 = new HttpCookie("ASP.NET_SessionId", ""); 
     cookie2.Expires = DateTime.Now.AddYears(-1); 
     Response.Cookies.Add(cookie2); 

     // Redirect the user to the login page 
     Response.Redirect("YourLoginPage.aspx", true); 
+0

これは動作します。私はasp:LoginStatusコードが正しくフラッシュされないが、logon.aspxにリダイレクトする問題がありました。そのため、このコードをpage_init関数にスタックし、if(Context.User.Identity.IsAuthenticated)でログインをテストしました。クッキーが適切に洗い流されたことを示します。 { – Rob

0

それはおそらく問題だあなたが経験したCookieドメインに関してでした。クッキーは"." + FormsAuthentication.CookieDomainに書き込まれる可能性があります。前に "admin.example.com"ドメインにクッキーを設定していて、クッキーの先頭に.が付いています。開発環境では、localhost

に書き込まれます。私が使用する解決策は、認証CookieとセッションCookieごとに2つのCookieを追加することです。

続くように私が使用しているソリューションです:

protected void SignOut(HttpContext Context) 
    { 
     FormsAuthentication.SignOut(); 
     Context.Session.Abandon(); 

     // clear authentication cookie 
     Context.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName) 
     { 
      Path = FormsAuthentication.FormsCookiePath, 
      Value = "", 
      Domain = (Convert.ToString(FormsAuthentication.CookieDomain).Length > 0) ? Convert.ToString(FormsAuthentication.CookieDomain) : Context.Request.Url.Host, 
      HttpOnly = true, 
      Expires = DateTime.Now.AddYears(-1) 
     }); 

     Context.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName) 
     { 
      Path = FormsAuthentication.FormsCookiePath, 
      Value = "", 
      Domain = (Convert.ToString(FormsAuthentication.CookieDomain).Length > 0) ? "." + Convert.ToString(FormsAuthentication.CookieDomain) : "." + Context.Request.Url.Host, 
      HttpOnly = true, 
      Expires = DateTime.Now.AddYears(-1) 
     }); 

     // clear session cookie (not necessary for the current problem but recommended anyway) 

     Context.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId") 
     { 
      Path = FormsAuthentication.FormsCookiePath, 
      Value = "", 
      Domain = (Convert.ToString(FormsAuthentication.CookieDomain).Length > 0) ? Convert.ToString(FormsAuthentication.CookieDomain) : Context.Request.Url.Host, 
      HttpOnly = true, 
      Expires = DateTime.Now.AddYears(-1) 
     }); 


     Context.Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId") 
     { 
      Path = FormsAuthentication.FormsCookiePath, 
      Value = "", 
      Domain = (Convert.ToString(FormsAuthentication.CookieDomain).Length > 0) ? "." + Convert.ToString(FormsAuthentication.CookieDomain) : "." + Context.Request.Url.Host, 
      HttpOnly = true, 
      Expires = DateTime.Now.AddYears(-1) 
     }); 


     FormsAuthentication.RedirectToLoginPage(); 
    } 

この呼び出しの結果は応答

場所に次のヘッダーを追加します。/Login.aspx? ReturnUrl =デフォルト。aspx

Set-Cookie:**** =; expires = Tue、1999年10月12日05:00:00 GMT;パス= /; HttpOnly

セットクッキー:**** =; domain = admin.example.com;有効期限=水曜日、2014年4月23日18:04:58 GMT;パス= /; HttpOnly

セットクッキー:**** =; domain = .admin.example.com;有効期限=水曜日、2014年4月23日18:04:58 GMT;パス= /; HttpOnly

Set-Cookie:ASP.NET_SessionId =; domain = admin.example.com expires =水曜日、2014年4月23日18:04:58 GMT;パス= /; HttpOnly

Set-Cookie:ASP.NET_SessionId =; domain = .admin.example.com expires = Wed、23-Apr-2014 18:04:58 GMT;パス= /; ***は私の暗号化された認証チケット値を含む私のクッキーの名前ですHttpOnlyの

。最初Set-CookieはおそらくFormsAuthentication.SignOut()メソッド呼び出しから生成されること


注意。

関連する問題