在网页中,我们提供了一个超链接 (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) 以加载登录表单
- 填写表格并提交
他们收到一个异常通知,通知他们 Anti-Forgery 令牌未提供或无效。
我不明白为什么会这样:视图(包含表单)是在浏览器休眠后创建的,因此防伪令牌应该都是“新鲜的”。但是,这种设计显然有问题,但我不确定如何最好地纠正它。
如果您有任何建议,请提前致谢。
格里夫