【发布时间】:2012-09-22 15:16:32
【问题描述】:
在网页中,我们提供了一个超链接 (GET),用户可以单击该超链接进行身份验证:
@Html.ActionLink("Please Login", "MyMethod", "MyController")
这映射到以下返回视图的控制器方法:
[RequireHttps]
public ActionResult MyMethod()
{
return this.View(new MyModel());
}
此视图包含用户提供其凭据的表单;表单包含所需的 AntiForgeryToken。
当用户提交表单时,会调用如下Controller方法:
[HttpPost]
[RequireHttps]
[ValidateAntiForgeryToken]
public ActionResult MyMethod(MyModel model)
{
// my logic
}
这很好用,大多数时候......
但是,如果用户让他们的浏览器打开“很长”一段时间,然后快速连续执行以下步骤:
- 单击超链接 (GET) 以加载登录表单
- 填写表格并提交
他们收到一个异常通知,通知他们防伪令牌未提供或无效。
我不明白为什么会这样:视图(包含表单)是在浏览器休眠后创建的,因此防伪令牌应该都是“新鲜的”。但是,这种设计显然有问题,但我不确定如何最好地纠正它。
如果您有任何建议,请提前感谢。
格里夫
【问题讨论】:
-
我只想提一下,我的应用已经遇到这个问题几年了,我很想有一个解决方案。我尝试了所有标准的机器密钥修复。
-
卷起袖子,潜入源头。我来操作泵。
-
有一个article 详细说明了令牌的验证步骤。一个步骤是针对 Context 的用户进行验证 - 不确定这是否可能不合时宜。无论哪种方式,解决方案仍不清楚。
标签: asp.net-mvc asp.net-mvc-3 security csrf antiforgerytoken