繁体   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