gpt4 book ai didi

asp.net-mvc - ASP.NET MVC - ValidateAntiForgeryToken 过期

转载 作者:行者123 更新时间:2023-12-03 23:43:06 24 4
gpt4 key购买 nike

在网页中,我们提供了一个超链接 (GET),用户可以点击该链接进行身份验证:

@Html.ActionLink("Please Login", "MyMethod", "MyController")

这映射到以下返回 View 的 Controller 方法:
    [RequireHttps]
public ActionResult MyMethod()
{
return this.View(new MyModel());
}

此 View 包含用户提供其凭据的表单;表单包含所需的 AntiForgeryToken。

当用户提交表单时,会调用以下 Controller 方法:
    [HttpPost]
[RequireHttps]
[ValidateAntiForgeryToken]
public ActionResult MyMethod(MyModel model)
{
// my logic
}

这非常有效,大多数情况下...

但是,如果用户将浏览器打开一段时间“重要”,然后快速连续执行以下步骤:
  • 单击超链接 (GET) 以加载登录表单
  • 填写表格并提交

  • 他们收到一个异常,通知他们未提供 Anti-Forgery token 或无效。

    我不明白为什么会这样: View (包含表单)是在浏览器休眠后创建的,因此防伪标记应该都是“新鲜的”。然而,这种设计显然有问题,但我不确定如何最好地纠正它。

    如果您有任何建议,请提前致谢。

    格里夫

    最佳答案

    我正在处理同样的问题,虽然我理解这个问题,但我不确定最好的解决方案。

    Anti-ForgeryToken 过程在表单中放置一个输入值,第二个值存储在 cookie RequestVerificationToken 中。这两个都提交给服务器,如果它们不匹配,则抛出错误。

    RequestVerficationToken cookie 的过期值设置为 Session。因此,当用户在页面上长时间打开浏览器然后提交时,cookie 的时间戳会与服务器上的 session 超时值进行比较——默认为 20 分钟左右——如果超过,则将其删除因此 token 验证失败。

    可能的解决方案,所有这些都有潜在的问题;

  • 在页面上放置一个 javascript 计时器并以更少的值刷新
    比您的 session 超时。
  • 捕获服务器上的 System.Web.Mvc.HttpAntiForgeryException - 并重定向
    到同一页面。
  • 增加您的 session 超时时间
  • 更改防伪 token 的过期时间
  • 关于asp.net-mvc - ASP.NET MVC - ValidateAntiForgeryToken 过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12678938/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com