ASP.NET Core 2.1:HTTP POST验证失败后导航回到页面会显示浏览器错误

Wel*_*ing 7 c# asp.net-core-mvc asp.net-core asp.net-core-2.1

问题:

使用ASP.NET Core 2.1 MVC项目,使用浏览器后退按钮返回到表单(表单POST无法通过服务器端验证)后,我收到以下浏览器错误消息:

Firefox中的错误消息:

文件已过期

该文档不再可用。

所请求的文档在Firefox的缓存中不可用。

  • 为了安全起见,Firefox不会自动重新请求敏感文档。
  • 单击“重试”以从网站重新请求文档。

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)攻击的Antiforgery系统将Cache-Control和Pragma标头设置为no-cache,这样就不会缓存响应。有关如何为HTML表单元素禁用防伪令牌的信息,请参见ASP.NET Core防伪配置。

我可以确认,如果@Html.AntiForgeryToken()从HTML表单中删除它,浏览器错误消息就会消失。

在使用的ASP.NET MVC5中,这不是问题AntiForgeryToken

题:

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();
    }
Run Code Online (Sandbox Code Playgroud)

更新:

我在ASP.NET Core Docs上发布了该问题:https : //github.com/aspnet/Docs/issues/7590

Ada*_*ent 5

这不是特定于语言的问题。这是浏览器行为。说这“不是ASP.NET MVC 5的问题”是不正确的。

解决方案:解决此问题的常用方法是PRG模式,该模式自1995年以来一直存在。

TempData可以在此处找到针对ASP.NET Core的此实现。

而且我认为此链接将对您最有用,因为它演示了在MVC 5和MVC 6中实现的方法。

我希望这有帮助!

在时间允许的情况下,我将尝试使用基于razor-page starter项目的示例来尽快更新此帖子。

  • 防伪令牌不应被缓存。一个新的提交应该需要一个新的令牌。该错误正是您*应该*看到的。遵循PRG模式,如答案所示。 (2认同)
  • @Wellspring 我相信质疑一切!我采取零进攻。我看了一下文章,自己实现了。我承认,我不喜欢这个解决方案,但这是迄今为止我能找到的最深思熟虑的解决方案。我会支持你在 github.com 上打开的问题。我认为asp.net核心团队可以为这种已经存在很长时间的常见模式提高开发人员的生活质量。 (2认同)