web-dev-qa-db-ja.com

ASP.NET Core 2.1:HTTP POSTが検証に失敗した後、ページに戻ると、ブラウザーエラーが表示されます

問題:

ASP.NET Core 2.1 MVCプロジェクトを使用して、ブラウザーの戻るボタンを使用してフォームに戻った後、次のブラウザーエラーメッセージが表示されます。フォームPOSTサーバー側の検証に失敗しました:

Firefoxのエラーメッセージ:

ドキュメントの有効期限が切れました

このドキュメントは利用できなくなりました。

リクエストされたドキュメントはFirefoxのキャッシュにありません。

  • セキュリティ上の予防措置として、Firefoxは機密文書を自動的に再要求しません。
  • [再試行]をクリックして、Webサイトからドキュメントを再要求します。

Chromeのエラーメッセージ:

フォームの再提出を確認

このウェブページを正しく表示するには、以前に入力したデータが必要です。このデータを再度送信することはできますが、そうすることで、このページが以前に実行したアクションを繰り返すことになります。

リロードボタンを押して、ページのロードに必要なデータを再送信します。

ERR_CACHE_MISS

再現する手順:

  1. サーバー側の検証が失敗したHTMLフォームの投稿を送信する
  2. 別のURLに移動する
  3. ブラウザの戻るボタンをクリックして、フォームのあるページに戻ります

注:

応答キャッシング( 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

7
Wellspring

これは言語固有の問題ではありません。これはブラウザの動作です。これが「ASP.NETMVC5の問題ではない」と言うのは誤りです。

解決策:これを解決する一般的な方法は、1995年以来存在している PRGパターン です。

TempDataを使用したASP.NETCoreのこれの実装は次のとおりです ここ

そして、これはMVC5とMVC6の両方で実装されたメソッドを示しているので、この link が最も役立つと思います。

これがお役に立てば幸いです。

時間の許す限り、かみそりページのスタータープロジェクトに基づいたサンプルでこの投稿をすぐに更新しようと思います。

5
Adam Vincent