2010-12-29 9 views
4

これはしばらく問題はありましたが、非常に散発的で、分離が困難です。ポストバックとリダイレクト後にHttpCookieが認証時に失われることがありました。

時々、ウェブアプリケーションで認証されたブラウザがしばらく開いていて、同じウェブアプリケーションに何度もログインしたり、複数のタブを持ったり、ほとんどすべてのブラウザ(Chrome、 IE、Firefox、Safari)、一見無作為に設定された後にAuthCookieを保持する能力を失い、その後リダイレクトされます。ブラウザを閉じて新しいセッションを開始すると、別のブラウザを開いて認証を試みるように、問題が解決されます。

私たちのチームは、すべてのWebサイトとWebアプリケーションに対してフォーム認証を使用しています。これは、ログインフォームが表示され、ユーザーが資格情報を入力し、ポストバックのクリックイベントでCookieが設定された後、Cookieが参照されて認証を完了するために使用される同じページにリダイレクトされます。リダイレクト後

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, Username, DateTime.Now, DateTime.Now.AddMinutes(SessionTimeout), false, Username); 
    HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authTicket)); 
    Response.Cookies.Add(faCookie); 
Response.Redirect(Request.RawUrl, true); 

、PREINITオン:この状況イベント内

FormsAuthentication.FormsCookieName = ".WebAuth" 

この時点で

HttpCookie authCookie = Request.Cookies[cookieName]; 

は、なAuthCookie変数は、典型的にはnullでありません上記で概説したこれらの分離された状況では、リダイレクト後にクッキーがnullに戻ります。

これは非常にランダムに発生することがあります。開発者の1人に影響を与えるまでに数週間かかる場合もあります。私が言ったように、ブラウザを再起動すると問題が解決されます。

今日私はChromeを使用している間、私たちのdevサーバー上で発生しました。私はアプリケーションにログインし、アプリケーションにセッションタイムアウトを許可した後、再度ログインしようとしました。試行されたログインは、Cookieの設定に失敗しました。 Visual Studioをサーバー上のプロセスにリモートで接続してデバッグを開始しました。新しいコードバージョンをアップデートしてサーバーに展開し、アプリケーションを再起動し、サーバー上でIISを再起動し、プロジェクトにアタッチして再接続すると、Chromeで問題が解決されました。 Firefoxでは、問題なく認証できました。

Chromeから、ログインが検証され、上記のように応答Cookieを設定しようとします。リダイレクトする前に、適切に設定されたResponse CookieとRequest Cookieの対応するCookieを確認できました。しかし、一見成功したログイン後のリダイレクトごとに、レスポンスとリクエストクッキーはなくなりました。

私はクッキーのコレクションを表示するには、アプリケーション上でトレースを有効に:

.WebAuthが要求クッキーのコレクションだけでなく、ASP.NET_SessionIdと、いくつかのASPSESSIONIDxxxxxxxxが、ページのロード時、唯一のASPであります.NET_SessionIdおよびASPSESSIONIDxxxxxxxxクッキーはRequest.Cookiesスコープで使用でき、.WebAuthの符号はありません。しかし、レンダリング後のページのトレース情報には、複数の.WebAuthクッキーがリストされていますが、ページにアクセスできないように見えるだけです。

主に、認証後の作業バージョンでは、ページのトレース情報に.WebAuth ResponseとRequest Cookieの両方があります。しかし、機能していないブラウザウィンドウでは、レスポンスCookieは存在しません。

他に誰もこの経験がありますか?それはそんなに問題があり、散発的ですが、私はそれを解決することが大好きです。私の懸念は、それがユーザーに影響を与えている可能性があり、問題の説明がそんなに複雑であるため、私たちは何の知識も持たないということです。

+0

は、開発環境でこれを遭遇したことがありますか?それとも、プロダクションでのみ?いくつのサーバーが関与していますか?私はロードバランサの問題のためにクッキーが「失われている」と似たようなことに遭遇したので尋ねます。 – ThatBlairGuy

+0

これは、プロダクション、ステージング、および開発で発生します。私たちのチームのすべての開発者は、時々、ブラウザごとに、また一度に1つのブラウザでしか発生しませんでした。開発とステージングは​​負荷分散されていませんが、生産はロードバランサの背後にあるファームにあります。すべてのマシンキーが一致します。上記の質問で参照された事件は、私たちのステージング環境にありました。 –

+0

それは今日、そして過去に起こった。 Fiddlerを使用して、私はブラウザにまだ古い「.ASPXAUTH」クッキーが残っていることがわかりました。 Response.Cookies.Add()を使用して新しいものを追加すると、.ASPXAUTHという名前の2つのCookie(Request.Headersに表示される)が存在し、Request.Cookiesはそれらを無視します。まだ、この二重のクッキーが最初にそこにいかにあったかを理解していませんが、ブラウザを再起動することでそれをクリアするのに役立ちます。ああ、Response.Cookies.Addの代わりにResponse.Cookies.Setを使用しても役に立ちません。あなたがこれに再び遭遇した場合は、私に知らせてください:-) – Razzie

答えて

1

シナリオに基づいて、ドメイン/クッキーあたりのCookieの数に関するブラウザの制限が発生している可能性があります。あなたはクッキーが送信されているかどうかを確認するために(バイオリンを使用してIE)実際のサーバーの応答を見てみてください再発を取得した場合

- :制限が比較的高いですが、(http://www.nczonline.net/blog/2008/05/17/browser-cookie-restrictions/http://www.ietf.org/rfc/rfc2109.txt、セクション6.3、最近のいくつかの情報スペックを)存在しますブラウザに送信します。ドメインと現在のページに設定されているCookieを確認します(ブラウザに応じてさまざまな方法がありますが、すべてのブラウザでアドレスバーのjavascript :alert(document.cookie)を実行すると表示されます)

+0

考えをありがとう。次回はそれが起こると私は追加情報を得て、私が見ていることをあなたに知らせます。問題を個々のブラウザに分離し、再起動することで解決することは理にかなっています。 –

1

これは非永続的ですクッキーの問題。セッションは単にタイムアウトします。

この行にtruefalseを変更してみてください:あなたが説明したよう

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, Username, DateTime.Now, DateTime.Now.AddMinutes(SessionTimeout), true, Username); 

また、私は似たような状況で秋を持って

faCookie.Expires = DateTime.Now.AddMinutes(SessionTimeout); 
0

を追加し、物事は確信しました。しかし、後に理由が見つかった。

ASP.NETとIISは、MyApplicationとmyapplicationを同じものとして理解していましたが、ブラウザーは異なるものとしてそれらを理解していました。ですから、/ MyApplicationの認証クッキーを設定すると、/ myapplicationに行くと、それらはサーバーに送られませんでした。

修正は次です:

protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     string url = HttpContext.Current.Request.Url.PathAndQuery; 
     string application = HttpContext.Current.Request.ApplicationPath; 

     if (!url.StartsWith(application)) 
     { 
      HttpContext.Current.Response.Redirect(application + url.Substring(application.Length)); 
      Response.End(); 
      return; 
     } 
    } 
関連する問題