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

Asp.net mvc ASP.NET MVC-ValidateAntiForgeryToken过期,asp.net-mvc,asp.net-mvc-3,security,csrf,antiforgerytoken,Asp.net Mvc,Asp.net Mvc 3,Security,Csrf,Antiforgerytoken,在网页中,我们提供了一个超链接(GET),用户可以单击该超链接进行身份验证: @Html.ActionLink("Please Login", "MyMethod", "MyController") 这映射到以下返回视图的控制器方法: [RequireHttps] public ActionResult MyMethod() { return this.View(new MyModel()); } 此视图包含用户提供其凭据的表单;该表单包含所需

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

@Html.ActionLink("Please Login", "MyMethod", "MyController")
这映射到以下返回视图的控制器方法:

    [RequireHttps]
    public ActionResult MyMethod()
    {
        return this.View(new MyModel());
    }
此视图包含用户提供其凭据的表单;该表单包含所需的AntiForgeryToken

当用户提交表单时,将调用以下控制器方法:

    [HttpPost]
    [RequireHttps]
    [ValidateAntiForgeryToken]
    public ActionResult MyMethod(MyModel model)
    {
        // my logic
    }
大多数情况下,这种方法非常有效

但是,如果用户在一段“重要”时间内保持浏览器打开状态,然后快速连续执行以下步骤:

  • 单击超链接(GET)以加载登录表单
  • 填写表格并提交
  • 他们得到一个异常,通知他们防伪令牌未提供或无效

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

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


    格里夫

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

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

    RequestVerficationToken cookie的过期值设置为会话。因此,当用户在页面上长时间保持浏览器打开状态,然后提交时,cookie的时间戳将与服务器上的会话超时值(默认值为20分钟左右)进行比较,超过该值后,它将被删除,因此令牌验证失败

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

  • 在页面上放置一个javascript计时器,并以较小的值刷新 超过会话超时
  • 捕获服务器上的System.Web.Mvc.HttpAntiforyException并重定向 到同一页
  • 增加会话超时
  • 更改防伪令牌的过期时间

  • 我只想提一下,我的应用程序已经经历了几年这个问题,我希望有一个解决方案。我尝试了所有标准的机器钥匙修复。卷起袖子,深入源头。我来操作泵。这里有一个详细说明令牌验证步骤的程序。其中一个步骤是针对上下文的用户进行验证——不确定这是否有失步。无论如何,解决方案都不清楚。请注意,据我所知,机器密钥用于验证服务器上的防伪令牌,在Web场中使用时是必需的(设置静态机器密钥可能会解决服务器上工作进程重新启动导致的错误情况),但是,它无法解决cookie过期问题。正如您所说,cookie过期与会话有关,因此解决方案3也应导致解决方案4。除非以某种方式手动重写cookie的生成方式。我曾经尝试过解决方案1,但它并不总是完全可靠的,所以3(如果可能)和2的组合似乎是最好的选择。