簡體   English   中英

ASP.NET Core 2.1:在HTTP POST失敗后導航回頁面驗證顯示瀏覽器錯誤

[英]ASP.NET Core 2.1: Navigating back to a page after an HTTP POST fails validation displays a browser error

問題:

使用ASP.NET Core 2.1 MVC項目,我使用瀏覽器后退按鈕返回到表單后收到以下瀏覽器錯誤消息,其中表單POST失敗服務器端驗證:

Firefox中的錯誤消息:

文件已過期

該文檔不再可用。

Firefox的緩存中不提供所請求的文檔。

  • 作為安全預防措施,Firefox不會自動重新請求敏感文檔。
  • 單擊“重試”以從網站重新請求文檔。

Chrome中的錯誤消息:

確認重新提交表單

此網頁需要您之前輸入的數據才能正確顯示。 您可以再次發送此數據,但通過這樣做,您將重復此頁面之前執行的任何操作。

按重新加載按鈕重新提交加載頁面所需的數據。

ERR_CACHE_MISS

重現步驟:

  1. 提交HTML表單帖子,其中服務器端驗證失敗
  2. 導航到其他網址
  3. 單擊瀏覽器后退按鈕返回帶有表單的頁面

筆記:

它似乎與Antiforgery系統禁用的響應緩存( https://docs.microsoft.com/en-us/aspnet/core/performance/caching/middleware?view=aspnetcore-2.1 )有關。

用於生成安全令牌以防止跨站點請求偽造(CSRF)攻擊的Antiforgery系統將Cache-Control和Pragma標頭設置為no-cache,以便不緩存響應。 有關如何禁用HTML表單元素的防偽標記的信息,請參閱ASP.NET Core防偽配置。

我可以確認,如果從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核心文檔上發布了這個問題: https//github.com/aspnet/Docs/issues/7590

這不是特定於語言的問題。 這是一種瀏覽器行為。 說這是“不是ASP.NET MVC 5的問題”是不正確的。

解決方案:解決這個問題的常用方法是自1995年以來一直存在的PRG模式

可以在此處找到使用TempData ASP.NET Core的實現

我認為這個鏈接對你最有幫助,因為它演示了在MVC 5和MVC 6中實現的方法。

我希望這有幫助!

在時間允許的情況下,我將盡快使用基於剃刀頁面啟動項目的示例嘗試更新此帖子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM