シングルページアプリケーションを構築していて、偽造防止トークンの問題が発生しています。
問題が発生する理由はわかっていますが、修正方法がわかりません。
次の場合にエラーが発生します。
- ログインしていないユーザーがダイアログをロードします(生成された偽造防止トークンを使用)
- ユーザーがダイアログを閉じる
- ユーザーがログインします
- ユーザーが同じダイアログを開く
- ユーザーがダイアログでフォームを送信
偽造防止トークンはユーザー「」を対象としていますが、現在のユーザーは「ユーザー名」です
これが発生する理由は、私のアプリケーションが100%単一ページであり、ユーザーがajax投稿を介して正常にログインすると/Account/JsonLogin
、サーバーから返された「認証済みビュー」で現在のビューを切り替えるだけで、リロードしないためです。ページ。
手順3と4の間にページを単純にリロードしてもエラーが発生しないため、これが理由であることがわかります。
したがって@Html.AntiForgeryToken()
、ロードされたフォームでは、ページがリロードされるまで、古いユーザーのトークンが返されるようです。
@Html.AntiForgeryToken()
新しい認証済みユーザーのトークンを返すように変更するにはどうすればよいですか?
私は毎回GenericalPrincipal
カスタムで新しいものを注入するので、呼び出されるまでに、実際には、プロパティがtrueに設定されたカスタムIDがありますが、ページのリロードを行わない限り、古いユーザーのトークンをレンダリングしているようです。IIdentity
Application_AuthenticateRequest
@Html.AntiForgeryToken()
HttpContext.Current.User.Identity
IsAuthenticated
@Html.AntiForgeryToken