メイン コンテンツへスキップ
サポート
Microsoft アカウントでサインイン
サインインまたはアカウントを作成してください。
こんにちは、
別のアカウントを選択してください。
複数のアカウントがあります
サインインに使用するアカウントを選択してください。

ASP .NET サポート音声列

フォーム認証のトラブルシューティング

ASP.NET サポート音声列へようこそ。 私の名前はJry Ormanです。 Microsoft と 5 年以上の関係にあり、ほとんどの時間を Microsoft FrontPage や新しい Microsoft SharePoint テクノロジなどの Web 関連テクノロジに集中してきました。 私は昨年、サポート エンジニアとして Microsoft ASP.NET と協力してきました。 今月のサポート音声列で、Microsoft ASP.NET でのフォーム認証のトラブルシューティング方法について説明します。

フォーム認証のトラブルシューティング

ASP.NET アプリケーションでフォーム認証を使用する場合は、ユーザーがログイン ページにランダムにリダイレクトされたときに発生する問題のトラブルシューティングが必要になることがあります。 理想的な世界では、この問題は、デバッガーを簡単にアタッチして問題をキャプチャできる方法で発生します。 ただし、運用環境では、このケースはほとんどありません。 このようなランダムな問題をトラブルシューティングするには、根本原因を絞り込むために、問題に関連する情報をログに記録する必要があります。

この列では、フォーム認証の概念について簡単に説明します。 次に、ユーザーがログイン ページにリダイレクトされるシナリオと、問題の分離に関連するデータをキャプチャする方法について説明します。 また、IHttpModule インターフェイスを実装してフォーム認証情報をログに記録する方法についても説明します。

フォーム認証の概要

ユーザーがフォーム認証を使用して Web サイトに対して認証を行うと、サーバーによって Cookie が作成されます。 Cookie の値は、暗号化されたフォーム認証チケットです。 Cookie はアプリケーションへの各要求でサーバーに渡され、FormsAuthenticationModule クラスは Cookie 値を復号化し、ユーザーが有効かどうかを判断します。

既定では、FormsAuthenticationModule クラスが Machine.config ファイルに追加されます。 FormsAuthenticationModule クラスは、FormsAuthentication プロセスを管理します。

Machine.config ファイルからのエントリを次に示します。

<httpModule>
     …other modules…
     <add name="FormsAuthentication"
         type="System.Web.Security.FormsAuthenticationModule" />
     …other modules…
</httpModule>

フォーム認証を使用して認証するための一般的な HTTP トラフィックは、次のようになります。

  1. クライアントは HTTP GET を Default.aspx に送信します。 フォーム認証 Cookie は送信されません。

  2. サーバーは、Login.aspx に 302 応答 (リダイレクト) を送信します。

  3. クライアントは、Login.aspx に HTTP POST を送信します。 ログイン情報が含まれます。

  4. サーバーは 302 応答 (リダイレクト) を Default.aspx に送信します。 フォーム認証 Cookie が含まれています。

  5. クライアントは HTTP GET を Default.aspx に送信します。 これには、フォーム認証 Cookie が含まれます。

フォーム認証の実装と使用の詳細については、次の MSDN Web サイトを参照してください。

http://msdn2.microsoft.com/en-us/library/7t6b43z4.aspx

http://msdn2.microsoft.com/en-us/library/system.web.security.formsauthentication(vs.71).aspx

http://msdn2.microsoft.com/en-us/library/system.web.security.formsauthenticationticket(vs.71).aspxフォーム認証 Cookie の共有の詳細については、次の ASP.NET Web サイトを参照してください。

http://quickstarts.asp.net/QuickStartv20/aspnet/doc/security/formsauth.aspx

ユーザーがログイン ページにリダイレクトされる理由

フォーム認証 Cookie が失われる

シナリオ 1


このシナリオでは、ユーザーが Web サイトにログオンします。 ある時点で、クライアントはサーバーに要求を送信し
、 FormsAuthenticationModule クラスは Cookie を受け取りません。 ユーザー要求に Cookie が含まれていないかどうかを判断するには、Microsoft インターネット インフォメーション サービス (IIS) で Cookie のログ記録を有効にします。 これを行うには、次の手順に従います。

  1. IIS Microsoft 管理コンソール (MMC) を開きます。

  2. Web サイトを右クリックし、[プロパティ] をクリックします

  3. [ Web サイト ] タブをクリックし、[ ログ記録の有効化] をクリックします。

  4. ログ形式が W3C 拡張ログ ファイル形式であることを確認します。

  5. [プロパティ] をクリックします。

  6. [詳細設定] タブをクリックし、[拡張プロパティ] をクリックします

  7. [拡張プロパティ] で、[Cookie(cs(Cookie))] チェック ボックスと [Referer (cs(Referer))] チェック ボックスをクリックして選択します。

この問題が発生した後、問題が発生したクライアントとそのクライアントの IP アドレスを特定します。 そのクライアントの IP アドレスで IIS ログをフィルター処理し、<Cookie> 列を表示します。

メモ ログ パーサーを使用して IIS ログを解析できます。 ログ パーサーをダウンロードするには、次の Microsoft Web サイトにアクセスします。

http://www.microsoft.com/download/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07 その特定のユーザーからの要求の一覧を取得したら、ログイン ページへの要求を検索します。 このページにリダイレクトされたことを知っており、リダイレクトが発生する前に要求を表示する必要があります。 次のような内容が表示された場合、クライアントは Cookie を送信しなかったか、クライアントとサーバーの間のネットワーク上で Cookie が削除されました。

これは最初のログインです。

方法/コマンド

ページ

応答

Cookie

取得

/Default.aspx

302 (リダイレクト)

Cookie なし

取得

/Login.aspx

200 (成功)

Cookie なし

投稿

/Login.aspx

302 (リダイレクト)

Cookie なし

取得

/Default.aspx

200 (成功)

.ASPXAUTH

取得

/SomePage.aspx

302 (リダイレクト)

いいえ。ASPXAUTH Cookie

これらは他の要求であり、その後に を含まないサイト上のページに対する要求が続きます。ASPXAUTH Cookie。

方法/コマンド

ページ

応答

Cookie

取得

/SomePage.aspx

302 (リダイレクト)

いいえ。ASPXAUTH Cookie

取得

/Login.aspx

200 (成功)

いいえ。ASPXAUTH Cookie

投稿

/Login.aspx

302 (リダイレクト)

いいえ。ASPXAUTH Cookie

取得

/SomePage.aspx

200 (成功)

.ASPXAUTH


メモ ユーザーからの最初の要求は、永続的な Cookie を作成しない限り、フォーム認証 Cookie を持っている可能性はありません。 IIS ログには、要求で受信した Cookie のみが表示されます。 フォーム認証 Cookie を取得するための最初の要求は、ログイン試行が成功した後に要求に対して行われます。

シナリオ 2


フォーム認証 Cookie は、クライアントの Cookie の制限を超えた場合にも失われる可能性があります。 Microsoft Internet エクスプローラーでは、20 個の Cookie の制限があります。 クライアントで 20 番目の Cookie が作成されると、以前の Cookie がクライアントのコレクションから削除されます。 の場合は 。ASPXAUTH Cookie が削除されると、次の要求が処理されると、ユーザーはログイン ページにリダイレクトされます。

これらの 2 つのシナリオのトラブルシューティングは、同じ方法で行うことができます。 ログイン ページへのリダイレクトの直前に要求を見てください。 このページへの要求で Cookie が生成された場合、これは調査対象になります。

Fiddler を使用して、クライアントに送信される HTTP ヘッダーを表示できます。 トラフィックをキャプチャした後、要求をダブルクリックし、[ ヘッダー ] をクリックして Set-Cookie ヘッダーを表示します。 成功したログインをトレースすると、成功したログインの応答に Set-Cookie ヘッダーが表示されます。

Fiddler をダウンロードするには、次の Fiddler Web サイトにアクセスします。

http://www.fiddlertool.com/fiddler/

シナリオ 3


要求がクライアントから離れると、送信されるパケットに影響を与える可能性のあるさまざまなレイヤーがあります。 ネットワーク デバイスが Cookie を削除しているかどうかを判断するには、クライアントとサーバーでネットワーク トレースをキャプチャし、Cookie の要求本文を調べる必要があります。 クライアント要求を確認して、Cookie が送信されたことを確認し、サーバー トレースをチェックして、サーバーが Cookie を受信したことを確認します。

クライアント要求

これは、ユーザーが認証された後の GET 要求です。 フォームの認証チケット情報は青で強調表示されています。 これにより、Cookie 情報がクライアントから離れたことが確認されます。 Netmon などのネットワーク キャプチャ ツールを使用すると、実際にアダプターを通過したトラフィックが表示されます。

47 45 54 20 68 74 74 70-3a 2f 2f 6c 6f 63 61 6c   GET http://local
68 6f 73 74 2f 46 6f 72-6d 73 41 75 74 68 4c 6f   host/FormsAuthLo
67 54 65 73 74 2f 57 65-62 46 6f 72 6d 31 2e 61   gTest/WebForm1.a
73 70 78 20 48 54 54 50-2f 31 2e 31 0d 0a 41 63   spx HTTP/1.1..Ac
63 65 70 74 3a 20 69 6d-61 67 65 2f 67 69 66 2c   cept: image/gif,
…Other headers of the GET request…
63 68 65 0d 0a 43 6f 6f-6b 69 65 3a 20 2e 41 53   che..Cookie: .AS
50 58 41 55 54 48 3d 33-43 45 46 39 42 39 41 30   PXAUTH=3CEF9B9A0
43 33 37 41 44 46 36 33-45 36 42 44 33 37 42 36   C37ADF63E6BD37B6
39 43 44 41 32 35 30 30-30 46 38 30 37 32 38 46   9CDA25000F80728F
35 31 43 39 35 36 36 44-31 34 43 35 34 31 34 35   51C9566D14C54145
38 31 43 39 33 45 32 41-30 31 44 44 43 44 45 46   81C93E2A01DDCDEF
32 34 41 31 37 34 32 39-34 31 30 43 30 39 37 34   24A17429410C0974
42 33 45 43 42 30 36 34-32 32 38 45 33 35 33 39   B3ECB064228E3539
39 41 38 32 32 42 33 42-39 33 36 44 46 30 38 46   9A822B3B936DF08F
42 41 42 44 33 45 31 30-32 44 30 30 32 31 30 43   BABD3E102D00210C
32 45 31 33 39 38 30 37-39 42 32 33 35 32 39 46   2E1398079B23529F
34 46 35 44 37 34 41 3b-20 50 72 6f 66 69 6c 65   4F5D74A; Profile
3d 56 69 73 69 74 6f 72-49 64 3d 62 32 34 65 62   =VisitorId=b24eb

サーバー側の要求

サーバーに到達した要求を確認するときは、クライアントが送信したのと同じ情報をサーバーが受信したことを確認する必要があります。 サーバーが同じ情報を受信しなかった場合は、ネットワーク上の他のデバイスを調査して、Cookie が削除された場所を特定する必要があります。

注: Cookie を削除する ISAPI フィルターのインスタンスもあります。 Web サーバーが Cookie を受け取ったが、Cookie が IIS ログに一覧表示されていないことを確認した場合は、ISAPI フィルターをチェックします。 問題が解決されたかどうかを確認するには、フィルターを削除する必要がある場合があります。

フォーム認証チケットがタイムアウトする

ユーザーがリダイレクトされるもう 1 つの一般的な原因は、フォーム認証チケットの有効期限が切れている場合です。 フォーム認証チケットは、2 つの方法でタイムアウトできます。 最初のシナリオは、絶対有効期限を使用する場合に発生します。 絶対有効期限が切れると、認証チケットは有効期限が切れると期限切れになります。 たとえば、有効期限を 20 分に設定し、ユーザーが午後 2 時にサイトにアクセスするとします。 ユーザーが午後 2 時 20 分後にサイトにアクセスした場合、ユーザーはログイン ページにリダイレクトされます。

スライディング有効期限を使用する場合、シナリオはもう少し複雑になります。 有効期限が半期限切れになった後にユーザーがサイトにアクセスすると、Cookie と結果のチケットが更新されます。 たとえば、スライド式の有効期限を使用して、有効期限を 20 分に設定します。 ユーザーが午後 2 時にサイトにアクセスすると、ユーザーは午後 2 時 20 分に有効期限が切れる Cookie を受け取ります。 有効期限は、ユーザーが午後 2 時 10 分以降にサイトにアクセスした場合にのみ更新されます。 ユーザーが午後 2 時 09 分にサイトにアクセスした場合、有効期限の半分が経過していないため、チケットは更新されません。 その後、ユーザーが午後 2 時 21 分にサイトにアクセスして 12 分待つと、チケットの有効期限が切れています。 ユーザーはログイン ページにリダイレクトされます。

この種類の問題にアプローチする方法の 1 つは、フォーム認証 Cookie とチケット情報をログに記録することです。 このようにして、Cookie が IIS によって受信されたかどうか、および値が何であるかを確認できます。 これを行うには、HttpModule を記述し、そのモジュールを要求パイプラインに接続します。 必要な情報を取得するためにアプリケーションのコードを変更する必要はありません。

添付されたサンプルは、Microsoft .NET Framework 1.1 と .NET Framework 2.0 で動作し、全体にコメントがあります。 このサンプルには、次のファイルが含まれています。

  • FormsAuthEvents.cs: IHttpModule を実装し、Application_BeginRequest イベントに結び付けするクラス。

  • FormsAuthInfo.cs: Cookie を取得し、フォーム認証チケットを復号化するクラス。 また、アプリケーションの Web.config ファイルをチェックして、フォーム認証が有効になっていることを確認します。

  • FormsAuthConfig.cs: FormsAuthLogger.config ファイルから情報を読み取るクラス。

  • Log.cs: 文字列ビルダーを受け入れ、値をログ ファイルに書き込むファイル。

  • FormsAuthLogger.config: Log.cs ファイルによって読み取られた XML ファイル。 このファイルは、ビルド DLL を含む /bin フォルダーに存在する必要があります。 このファイルを使用すると、次の構成を行うことができます。

    • [IP でフィルター処理]: クライアント IP でデータのキャプチャをフィルター処理できます。 これにより、問題を再現することがわかっているクライアントからの要求のみをログに記録できます。 これにより、ログのサイズが小さくなります。

    • キャプチャの種類: ファイルを保存する場所を指定します。 既定値は [一時 ASP.NET ファイル] フォルダーですが、ワーカー プロセス アカウントがフォルダーに書き込む機能がある限り、このフォルダーは任意の場所に保存できます。

注: FormsAuthLogger.zip ファイルで指定されたコードのダウンロード リンクを提供します。

私はここでメイン領域を指摘します:

  1. IHttpModule インターフェイスを実装するクラスを作成します。

    public class FormsAuthEvents : IHttpModule 
    {
    …code…
    }
  2. 見たいイベントを結び付ける。 このサンプルでは、Application_BeginRequest イベントを使用しています。 これにより、各要求を調査し、フォーム認証 Cookie があるかどうかを判断し、Cookie が存在する場合は FormsAuthenticationTicket をログに記録できます。

    public void Init(HttpApplication application) 
    {
    //Wire up the BeginRequest event
    application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
    }
  3. Application_BeginRequest イベントを実装します。

    private void Application_BeginRequest(Object source, EventArgs e)
    {
       …code to log the ticket…
    }
    
  4. フォーム認証 Cookie を取得し、復号化します。

  5. 値をログに記録します。 フォーム情報に加えて、次のログを記録することをお勧めします。 これにより、必要に応じてフォーム認証情報を IIS ログに並べることができます。

    • 日付: 要求がいつ入ってきたか確認できます。

    • RequestType: 要求が Get か Post かを示します。

    • URL: 問題に至るまでの要求のパターンを示します。

    • リファラー

    • ClientIP: 要求を特定のクライアントに結び付けます。

ヘルプを表示

その他のオプションが必要ですか?

サブスクリプションの特典の参照、トレーニング コースの閲覧、デバイスのセキュリティ保護方法などについて説明します。

コミュニティは、質問をしたり質問の答えを得たり、フィードバックを提供したり、豊富な知識を持つ専門家の意見を聞いたりするのに役立ちます。

この情報は役に立ちましたか?

言語の品質にどの程度満足していますか?
どのような要因がお客様の操作性に影響しましたか?
[送信] を押すと、Microsoft の製品とサービスの改善にフィードバックが使用されます。 IT 管理者はこのデータを収集できます。 プライバシーに関する声明。

フィードバックをいただき、ありがとうございます。

×