在网页中,我们提供了用户可以点击进行身份验证的超链接(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令牌未提供或无效。
我不明白为什么会这样:View(包含表单)是在浏览器处于休眠状态之后创建的,因此防伪标记应该都是“新鲜的”。但是,这个设计显然有些问题,但我不确定如何最好地纠正它。
如果您有任何建议,请提前致谢。
格里夫