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



问题:

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

Firefox中的错误消息:

文档过期

此文档不再可用。

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

  • 作为安全预防措施,Firefox不会自动重新请求敏感文档
  • 单击"重试"从网站重新请求文档

Chrome中的错误消息:

确认表单重新提交

此网页需要您之前输入的数据才能正确显示。您可以再次发送此数据,但这样做可以将重复此页面以前执行的任何操作。

按重新加载按钮重新提交加载页面所需的数据。

ERR_CACHE_MISS-

复制步骤:

  1. 提交HTML表单帖子,其中服务器端验证失败
  2. 导航到其他URL
  3. 单击浏览器返回按钮返回到表单所在的页面

注意:

它似乎与响应缓存有关(https://learn.microsoft.com/en-us/aspnet/core/performance/caching/middleware?view=aspnetcore-2.1(被禁用。

用于生成安全令牌以防止跨站点请求伪造(CSRF(攻击设置缓存控制和Pragma标头没有缓存,因此不会缓存响应。对于有关如何禁用HTML表单的防目标标记的信息元素,请参阅ASP.NET Core防目标配置。

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

这在使用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中实现的方法。

我希望这能有所帮助!

如果时间允许,我会很快尝试更新这篇文章,并提供一个基于剃须刀页入门项目的样本。

最新更新