在网页中,我们提供一个超链接(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-Forgery 令牌未提供或无效。
我不明白为什么会出现这种情况:视图(包含表单)是在浏览器处于空闲状态之后创建的,因此防伪令牌应该都是“新鲜的”。不过,设计上显然存在问题,但我不确定如何最好地改正它。
如果您有任何建议,请提前致谢。
Griff