问题:
使用 ASP.NET Core 2.1 MVC 项目,在使用浏览器后退按钮返回到表单POST(表单POST无法通过服务器端验证)后,我收到以下浏览器错误消息:
Firefox中的错误消息:
文档已过期
该文档不再可用。
所请求的文档在Firefox的缓存中不可用。
- 为安全起见,Firefox不会自动重新请求敏感文档。
- 单击“重试”以从网站重新请求文档。
Chrome中的错误消息:
确认表格重新提交
此网页需要您之前输入的数据才能被 正确显示。您可以再次发送此数据,但是这样做 将重复此页面先前执行的任何操作。
按重新加载按钮重新提交加载页面所需的数据。
ERR_CACHE_MISS
复制步骤:
注释:
这似乎与为防伪系统禁用了响应缓存(https://docs.microsoft.com/en-us/aspnet/core/performance/caching/middleware?view=aspnetcore-2.1)有关。
防伪系统,用于生成安全令牌以防止 跨站点请求伪造(CSRF)攻击设置了Cache-Control和 实用程序标头设置为不缓存,以便不缓存响应。对于 有关如何为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 Core Docs上发布了问题: https://github.com/aspnet/Docs/issues/7590
答案 0 :(得分:4)
这不是特定于语言的问题。这是浏览器行为。说这“不是ASP.NET MVC 5的问题”是不正确的。
解决方案: 解决此问题的一种常见方法是PRG pattern,该方法自1995年以来一直存在。
可以使用here找到TempData
的ASP.NET Core的实现。
我认为这个link对您最有帮助,因为它演示了在MVC 5和MVC 6中实现的方法。
我希望这会有所帮助!
在时间允许的情况下,我将尝试使用基于razor-page入门项目的示例来尽快更新此帖子。