在网页中,我们提供一个超链接 (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) 加载登录表单
- 填写表格并提交
他们收到一个异常,通知他们防伪令牌未提供或无效。
我不明白为什么会出现这种情况:视图(包含表单)是在浏览器休眠后创建的,因此防伪令牌应该都是“新鲜的”。然而,这个设计显然有问题,但我不确定如何最好地纠正它。
如果您有任何建议,请先致谢。
Griff
我正在处理同样的问题,虽然我理解这个问题,但我还不确定最佳解决方案。
Anti-ForgeryToken 流程将输入值放入表单中,并将第二个值存储在 cookie RequestVerificationToken 中。这两个都被提交到服务器,如果它们不匹配,则会抛出错误。
RequestVerficationToken cookie 的过期值设置为 Session。因此,当用户在页面上长时间打开浏览器然后提交时,cookie 的时间戳会与服务器上的会话超时值(默认为 20 分钟左右)进行比较,一旦超过,就会将其删除因此令牌验证失败。
可能的解决方案,都有潜在的问题;
- 在页面上放置一个 javascript 计时器并以较小的值刷新
比你的会话超时。
- 在服务器上捕获 System.Web.Mvc.HttpAntiForgeryException - 并重定向
到同一页面。
- 增加会话超时时间
- 更改防伪令牌的有效期
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)