[解決済み] 偽造防止トークンはユーザー""のためのものですが、現在のユーザーは "username "です。
質問
シングルページのアプリケーションを作成しているのですが、アンチフォージェリートークンの問題が発生しました。
問題が発生する理由はわかっていますが、修正する方法がわかりません。
次のようなときにエラーが発生します。
- 非ログインユーザーがダイアログをロードする (生成されたアンチフォージェリトークンを使用する)
- ユーザーがダイアログを閉じる
- ユーザがログインする
- ユーザが同じダイアログを開く
- ユーザがダイアログ内のフォームを送信する
偽造防止トークンはユーザ "" 向けのものですが、現在のユーザは "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()
を最初に呼び出したときは、ユーザーはログインしていないので、トークンのユーザー名は空文字列になります。ユーザーがログインした後、アンチフォージェリトークンを置き換えないと、検証を通過することができません。
この問題を解決するために、いくつかのオプションがあります。
-
今回だけSPAに完全なPOSTをさせ、ページが再読み込みされたときに、更新されたユーザー名を埋め込んだアンチフォージェリ トークンを持つようにします。
-
だけで部分ビューを持つ
@Html.AntiForgeryToken()
で部分ビューを構成し、ログインした直後に別の AJAX リクエストを実行し、既存のアンチフォージェリ トークンをリクエストのレスポンスで置き換えます。
を設定することに注意してください。
AntiForgeryConfig.SuppressIdentityHeuristicChecks = true
を設定することは、ユーザ名の検証を無効にするのではなく、 単にその検証の方法を変えるだけであることに注意してください。このため
ASP.NET MVC ドキュメント
を、また
ソースコード
で、そのプロパティが読み込まれる
ソースコード
では、トークンのユーザー名がその設定の値に関係なく検証されます。
関連
-
[解決済み] アンチフォージェリーの必須項目「__RequestVerificationToken」が存在しない ユーザー登録時のエラーについて
-
[解決済み] MVC-3から4へ変換されたアプリでSystem.Web.Optimizationへの参照を追加する方法
-
[解決済み】@Scripts.Render("~/bundles/jquery")を使用する理由)
-
[解決済み] ASP.NET 4.5がWebサーバーに登録されていない
-
[解決済み] 全ページ共通のデータをレイアウトに渡す
-
[解決済み] 偽造防止トークンはユーザー""のためのものですが、現在のユーザーは "username "です。
-
[解決済み] ASP.NET MVC 4のデバッグモードでバンドルとミニフィケーションを有効にする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] アンチフォージェリーの必須項目「__RequestVerificationToken」が存在しない ユーザー登録時のエラーについて
-
[解決済み] MVC-3から4へ変換されたアプリでSystem.Web.Optimizationへの参照を追加する方法
-
[解決済み】@Scripts.Render("~/bundles/jquery")を使用する理由)
-
[解決済み] ASP.NET 4.5がWebサーバーに登録されていない
-
[解決済み] 全ページ共通のデータをレイアウトに渡す
-
[解決済み] 偽造防止トークンはユーザー""のためのものですが、現在のユーザーは "username "です。
-
[解決済み] ASP.NET MVC 4のデバッグモードでバンドルとミニフィケーションを有効にする