偽造防止トークンはユーザー「」用ですが、現在のユーザーは「ユーザー名」です 質問する

偽造防止トークンはユーザー「」用ですが、現在のユーザーは「ユーザー名」です 質問する

シングルページ アプリケーションを構築していますが、偽造防止トークンに関する問題が発生しています。

問題が発生する理由はわかっていますが、解決方法がわかりません。

次の場合にエラーが発生します。

  1. ログインしていないユーザーがダイアログを読み込む(生成された偽造防止トークンを使用)
  2. ユーザーがダイアログを閉じる
  3. ユーザーがログイン
  4. ユーザーは同じダイアログを開く
  5. ユーザーがダイアログでフォームを送信する

偽造防止トークンはユーザー「」用ですが、現在のユーザーは「ユーザー名」です

これが起こる理由は、私のアプリケーションが100%シングルページであり、ユーザーがAjaxポストを通じてログインに成功すると/Account/JsonLogin、現在のビューをサーバーから返された「認証済みビュー」に切り替えるだけですが、ページを再読み込みしないでください。

手順 3 と 4 の間でページをリロードするだけでエラーが発生しないため、これが理由であることがわかります。

@Html.AntiForgeryToken()したがって、ページが再読み込みされるまで、読み込まれたフォームでは古いユーザーのトークンが返されるようです。

@Html.AntiForgeryToken()新しい認証済みユーザーのトークンを返すように変更するにはどうすればよいですか?

呼び出されるたびに、GenericalPrincipalカスタムでIIdentity新しいものを挿入します。実際、プロパティが true に設定されたカスタム Identity ですが、ページを再読み込みしない限り、古いユーザーのトークンがレンダリングされるようです。Application_AuthenticateRequest@Html.AntiForgeryToken()HttpContext.Current.User.IdentityIsAuthenticated@Html.AntiForgeryToken

ベストアンサー1

これは、偽造防止トークンが、検証を強化するために、暗号化されたトークンの一部としてユーザーのユーザー名を埋め込むために発生します。 を最初に呼び出すとき、@Html.AntiForgeryToken()ユーザーはログインしていないため、トークンのユーザー名は空の文字列になります。ユーザーがログインした後、偽造防止トークンを置き換えないと、最初のトークンは匿名ユーザー用でしたが、現在は既知のユーザー名を持つ認証済みユーザーであるため、検証に合格しません。

この問題を解決するにはいくつかの選択肢があります:

  1. 今回は、SPA に完全な POST を実行させ、ページが再読み込みされると、更新されたユーザー名が埋め込まれた偽造防止トークンがページに表示されます。

  2. ログイン直後に部分的なビューを取得し@Html.AntiForgeryToken()、別の AJAX リクエストを実行して、既存の偽造防止トークンをリクエストの応答に置き換えます。

この設定はAntiForgeryConfig.SuppressIdentityHeuristicChecks = trueユーザー名の検証を無効にするものではなく、検証の動作方法を変更するだけです。ASP.NET MVC ドキュメントソースコードそのプロパティが読み取られる場所と、ソースコードトークン内のユーザー名は、その構成の値に関係なく検証されます。

おすすめ記事