ASP.NET MVCとWebページでXSRF / CSRF対策
トークンの生成
抗XSRFトークンを生成するには、呼び出し@ Html.AntiForgeryTokenカミソリページからMVCのビューまたは@ AntiForgery.GetHtml()からメソッドを。ランタイムは、次の手順を実行します。
- 現在のHTTPリクエストがすでに含まれている場合は抗XSRFのセッショントークン(抗XSRFクッキー__RequestVerificationToken)を、セキュリティトークンは、それから抽出されます。HTTPリクエストは、トークンやセキュリティトークンの抽出に失敗した場合は、新しいランダムな抗XSRFトークンが生成されます抗XSRFセッションが含まれていない場合。
- 抗XSRFフィールドトークンは、(1)上記のステップと、現在ログインしているユーザのアイデンティティからセキュリティトークンを使用して生成されます。(ユーザの同一性を決定する方法の詳細については、参照特別なサポートとシナリオを以下のセクション。)場合はさらに、IAntiForgeryAdditionalDataProviderが構成され、ランタイムはその呼ぶGetAdditionalDataの方法を、フィールドトークンで返される文字列を含みます。(参照設定と拡張性の詳細については、セクションを。)
- 新しい抗XSRFトークンがステップ(1)で生成された場合、新しいセッショントークンは、それを保存するために作成され、アウトバウンドHTTPクッキーコレクションに追加されます。ステップ(2)からフィールドトークンがでラップされる
<input type="hidden" />
要素、およびこのHTMLマークアップは、戻り値となりますHtml.AntiForgeryToken()
か、AntiForgery.GetHtml()
。
トークンを検証
入ってくる抗XSRFトークンを検証するために、開発者が含まれValidateAntiForgeryTokenの彼女のMVCのアクションやコントローラの属性を、または彼女が呼び出す@AntiForgery.Validate()
彼女カミソリページから。ランタイムは、次の手順を実行します。
- 着信セッショントークンフィールドトークンが読み取りおよび抗XSRFトークンはそれぞれから抽出されます。抗XSRFトークンが生成ルーチンのステップ(2)当たり同一でなければなりません。
- 現在のユーザーが認証されている場合は、彼女の名は、フィールドトークンに格納されているユーザー名と比較されます。ユーザ名が一致している必要があります。
- 場合IAntiForgeryAdditionalDataProviderが設定され、実行時には、その呼び出しをValidateAdditionalDataの方法を。この方法は、ブール値を返す必要があります真。
検証が成功した場合、要求は進行させます。検証が失敗した場合、フレームワークがスローされますHttpAntiForgeryExceptionを。
障害状態
ASP.NET Web StackのランタイムV2以降では、任意のHttpAntiForgeryException検証中にスローされます何が悪かったのかについての詳細な情報が含まれています。現在定義されている障害状態は以下のとおりです。
- セッショントークンまたはフォームトークンがリクエストに存在しません。
- セッショントークンまたはフォームトークンが読めないです。この最も可能性の高い原因は、ASP.NET Web StackのランタイムまたはWeb.configファイルで、<のmachineKey>要素は、マシン間で異なって農場の不一致のバージョンを実行している農場です。あなたは、どちらかの抗XSRFトークンを改ざんすることによって、この例外を強制するためにこのようなフィドラーなどのツールを使用することができます。
- セッショントークンとフィールドトークンが交換されました。
- セッショントークンとフィールドのトークンが一致しないセキュリティトークンが含まれています。
- フィールド・トークン内に埋め込まれたユーザー名は、現在ログインしているユーザーのユーザー名と一致していません。
- IAntiForgeryAdditionalDataProvider.ValidateAdditionalDataの方法が返さ偽。
抗XSRF施設もトークン生成または検証中に追加のチェックを行うことができ、これらのチェック時の失敗は、例外がスローされる可能性があります。参照してくださいWIF / ACS /クレームベース認証と設定および拡張性の詳細については、セクションを。
ASP.NETコアで防ぐ、クロスサイトリクエストフォージェリ(XSRF / CSRF)攻撃