シングルページ アプリケーションを構築していますが、偽造防止トークンに関する問題が発生しています。
問題が発生する理由はわかっていますが、解決方法がわかりません。
次の場合にエラーが発生します。
- ログインしていないユーザーがダイアログを読み込む(生成された偽造防止トークンを使用)
- ユーザーがダイアログを閉じる
- ユーザーがログイン
- ユーザーは同じダイアログを開く
- ユーザーがダイアログでフォームを送信する
偽造防止トークンはユーザー「」用ですが、現在のユーザーは「ユーザー名」です
これが起こる理由は、私のアプリケーションが100%シングルページであり、ユーザーがAjaxポストを通じてログインに成功すると/Account/JsonLogin
、現在のビューをサーバーから返された「認証済みビュー」に切り替えるだけですが、ページを再読み込みしないでください。
手順 3 と 4 の間でページをリロードするだけでエラーが発生しないため、これが理由であることがわかります。
@Html.AntiForgeryToken()
したがって、ページが再読み込みされるまで、読み込まれたフォームでは古いユーザーのトークンが返されるようです。
@Html.AntiForgeryToken()
新しい認証済みユーザーのトークンを返すように変更するにはどうすればよいですか?
呼び出されるたびに、GenericalPrincipal
カスタムでIIdentity
新しいものを挿入します。実際、プロパティが true に設定されたカスタム Identity ですが、ページを再読み込みしない限り、古いユーザーのトークンがレンダリングされるようです。Application_AuthenticateRequest
@Html.AntiForgeryToken()
HttpContext.Current.User.Identity
IsAuthenticated
@Html.AntiForgeryToken
ベストアンサー1
これは、偽造防止トークンが、検証を強化するために、暗号化されたトークンの一部としてユーザーのユーザー名を埋め込むために発生します。 を最初に呼び出すとき、@Html.AntiForgeryToken()
ユーザーはログインしていないため、トークンのユーザー名は空の文字列になります。ユーザーがログインした後、偽造防止トークンを置き換えないと、最初のトークンは匿名ユーザー用でしたが、現在は既知のユーザー名を持つ認証済みユーザーであるため、検証に合格しません。
この問題を解決するにはいくつかの選択肢があります:
今回は、SPA に完全な POST を実行させ、ページが再読み込みされると、更新されたユーザー名が埋め込まれた偽造防止トークンがページに表示されます。
ログイン直後に部分的なビューを取得し
@Html.AntiForgeryToken()
、別の AJAX リクエストを実行して、既存の偽造防止トークンをリクエストの応答に置き換えます。
この設定はAntiForgeryConfig.SuppressIdentityHeuristicChecks = true
ユーザー名の検証を無効にするものではなく、検証の動作方法を変更するだけです。ASP.NET MVC ドキュメント、ソースコードそのプロパティが読み取られる場所と、ソースコードトークン内のユーザー名は、その構成の値に関係なく検証されます。