1. ホーム
  2. asp.net-mvc-4

[解決済み] 偽造防止トークンはユーザー""のためのものですが、現在のユーザーは "username "です。

2022-06-10 19:25:01

質問

シングルページのアプリケーションを作成しているのですが、アンチフォージェリートークンの問題が発生しました。

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

次のようなときにエラーが発生します。

  1. 非ログインユーザーがダイアログをロードする (生成されたアンチフォージェリトークンを使用する)
  2. ユーザーがダイアログを閉じる
  3. ユーザがログインする
  4. ユーザが同じダイアログを開く
  5. ユーザがダイアログ内のフォームを送信する

偽造防止トークンはユーザ "" 向けのものですが、現在のユーザは "username"です。

この現象が発生する理由は、私のアプリケーションは100%シングルページであり、ユーザーが /Account/JsonLogin への jax 投稿によってユーザーがログインに成功すると、私は現在のビューをサーバーから返された "認証済みビュー" で単純に切り替えますが、次のようになります。 はページを再読み込みしません。

ステップ3と4の間で単純にページを再読み込みすると、エラーが出ないので、これが原因だと思います。

ということは、どうやら @Html.AntiForgeryToken() は、ページが再読み込みされるまで、古いユーザーのトークンを返します。

どうすれば @Html.AntiForgeryToken() を変更して、新しい認証されたユーザのトークンを返すようにできますか?

私は新しい GenericalPrincipal に、カスタム IIdentity を使用しています。 Application_AuthenticateRequest であるため @Html.AntiForgeryToken() が呼ばれる頃には HttpContext.Current.User.Identity は、実際には私のカスタムIdentityで IsAuthenticated プロパティが true に設定されており、さらに @Html.AntiForgeryToken は、ページを再読み込みしない限り、古いユーザーのトークンをレンダリングするようです。

どのように解決するのですか?

これは、アンチフォージェリトークンが、より良い検証のために、暗号化されたトークンの一部としてユーザーのユーザー名を埋め込むために起こっていることです。最初に @Html.AntiForgeryToken() を最初に呼び出したときは、ユーザーはログインしていないので、トークンのユーザー名は空文字列になります。ユーザーがログインした後、アンチフォージェリトークンを置き換えないと、検証を通過することができません。

この問題を解決するために、いくつかのオプションがあります。

  1. 今回だけSPAに完全なPOSTをさせ、ページが再読み込みされたときに、更新されたユーザー名を埋め込んだアンチフォージェリ トークンを持つようにします。

  2. だけで部分ビューを持つ @Html.AntiForgeryToken() で部分ビューを構成し、ログインした直後に別の AJAX リクエストを実行し、既存のアンチフォージェリ トークンをリクエストのレスポンスで置き換えます。

を設定することに注意してください。 AntiForgeryConfig.SuppressIdentityHeuristicChecks = true を設定することは、ユーザ名の検証を無効にするのではなく、 単にその検証の方法を変えるだけであることに注意してください。このため ASP.NET MVC ドキュメント を、また ソースコード で、そのプロパティが読み込まれる ソースコード では、トークンのユーザー名がその設定の値に関係なく検証されます。