【发布时间】:2018-07-12 17:50:07
【问题描述】:
问题:
使用 ASP.NET Core 2.1 MVC 项目,我在使用浏览器后退按钮返回表单后收到以下浏览器错误消息,其中表单 POST 未通过服务器端验证:
Firefox 中的错误消息:
文档已过期
此文档不再可用。
请求的文档在 Firefox 的缓存中不可用。
- 作为安全预防措施,Firefox 不会自动重新请求敏感文档。
- 单击重试以从网站重新请求文档。
Chrome 中的错误消息:
确认重新提交表单
此网页需要您之前输入的数据才能 正确显示。您可以再次发送此数据,但这样做您 将重复此页面之前执行的所有操作。
按重新加载按钮重新提交加载页面所需的数据。
ERR_CACHE_MISS
重现步骤:
- 提交 HTML 表单帖子,其中服务器端验证失败
- 导航到不同的 URL
- 点击浏览器返回按钮,返回表单页面
注意事项:
这似乎与 Antiforgery 系统禁用响应缓存 (https://docs.microsoft.com/en-us/aspnet/core/performance/caching/middleware?view=aspnetcore-2.1) 有关。
Antiforgery 系统用于生成安全令牌以防止 跨站点请求伪造 (CSRF) 攻击设置 Cache-Control 和 Pragma 标头为 no-cache 以便不缓存响应。为了 有关如何禁用 HTML 表单的防伪令牌的信息 元素,请参阅 ASP.NET Core 防伪配置。
我可以确认的是,如果您从 HTML 表单中删除 @Html.AntiForgeryToken(),浏览器错误消息就会消失。
这在 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();
}
更新:
我在 ASP.NET Core Docs 上发布了这个问题: https://github.com/aspnet/Docs/issues/7590
【问题讨论】:
-
“在使用 AntiForgeryToken 的 ASP.NET MVC5 中不是问题”,“有没有人找到继续使用 Antiforgery 系统并防止出现此浏览器错误消息的方法” 那么是哪一个?你的意思是这不是框架的问题,还是你的问题不是由防伪引起的
-
Antiforgery 并未在
ASP.NET MVC5中引起此问题,但它现在在ASP.NET Core 2.1中引起了问题。我正在将 MVC5 项目迁移到 Core 2.1,这就是我提到旧框架的原因。 -
我认为当您单击后退按钮时,他说这是 .Net Core 中的一个新问题,尽管我认为出于安全原因出现错误是有道理的,以防他们重新提交表单或干预 ViewState页面..您只需要使用自定义错误页面以礼貌的方式呈现它。
-
@numbtongue 在没有自定义错误页面的情况下,其他网站如何避免这种情况?我没有看到任何主要网站有这个问题。例如,如果您向 ASP.NET (login.asp.net/account/login) 提交无效登录,然后转到其他页面,然后返回浏览器,则不会在此处显示浏览器错误消息。
-
如果它是一个单页网站,他们可以管理浏览器历史记录,这样您就不会真正离开该页面,但好问题可能有人可以回答..
标签: c# asp.net-core asp.net-core-mvc asp.net-core-2.1