問題:
ASP.NET Core 2.1 MVCプロジェクトを使用して、ブラウザーの戻るボタンを使用してフォームに戻った後、次のブラウザーエラーメッセージが表示されます。フォームPOSTサーバー側の検証に失敗しました:
Firefoxのエラーメッセージ:
ドキュメントの有効期限が切れました
このドキュメントは利用できなくなりました。
リクエストされたドキュメントはFirefoxのキャッシュにありません。
- セキュリティ上の予防措置として、Firefoxは機密文書を自動的に再要求しません。
- [再試行]をクリックして、Webサイトからドキュメントを再要求します。
Chromeのエラーメッセージ:
フォームの再提出を確認
このウェブページを正しく表示するには、以前に入力したデータが必要です。このデータを再度送信することはできますが、そうすることで、このページが以前に実行したアクションを繰り返すことになります。
リロードボタンを押して、ページのロードに必要なデータを再送信します。
ERR_CACHE_MISS
再現する手順:
注:
応答キャッシング( https://docs.Microsoft.com/en-us/aspnet/core/performance/caching/middleware?view=aspnetcore-2.1 )が無効になっていることに関連しているようです。偽造防止システム。
クロスサイトリクエストフォージェリ(CSRF)攻撃を防ぐために安全なトークンを生成するための偽造防止システムは、応答がキャッシュされないように、Cache-ControlヘッダーとPragmaヘッダーをキャッシュなしに設定します。 HTMLフォーム要素の偽造防止トークンを無効にする方法については、ASP.NETCoreの偽造防止構成を参照してください。
確認できますが、HTMLフォームに@Html.AntiForgeryToken()
を含めないようにすると、ブラウザのエラーメッセージが消えます。
これは、AntiForgeryToken
を使用するASP.NET MVC5では問題ではありませんでした。
質問:
ASP.NET Core 2.1で、Antiforgeryシステムを引き続き使用し、ブラウザーが戻ったときにこのブラウザーエラーメッセージが表示されないようにする方法を見つけた人はいますか?ボタンを使用しますか?
これが私のPOSTアクションです:
[HttpPost]
[ValidateAntiForgeryToken]
[ActionName("Contact-Form")]
public async Task<ActionResult> ContactForm(ContactFormViewModel cfvm)
{
if (ModelState.IsValid)
{
// << Handling of the form submit code here >>
TempData["Success"] = string.Format("Your contact request was submitted successfully!");
return RedirectToAction("Contact-Form-Success");
}
TempData["Error"] = "The form did not submit successfully. Please verify that all of the required fields are filled.";
return View();
}
更新:
ASP.NET Core Docsに質問を投稿しました: https://github.com/aspnet/Docs/issues/759