DrG*_*iff 13 security asp.net-mvc csrf antiforgerytoken asp.net-mvc-3
在网页中,我们提供了用户可以点击进行身份验证的超链接(GET):
@Html.ActionLink("Please Login", "MyMethod", "MyController")
Run Code Online (Sandbox Code Playgroud)
这将映射到以下返回视图的控制器方法:
[RequireHttps]
public ActionResult MyMethod()
{
return this.View(new MyModel());
}
Run Code Online (Sandbox Code Playgroud)
此视图包含用户提供凭据的表单; 表单包含所需的AntiForgeryToken.
当用户提交表单时,将调用以下Controller方法:
[HttpPost]
[RequireHttps]
[ValidateAntiForgeryToken]
public ActionResult MyMethod(MyModel model)
{
// my logic
}
Run Code Online (Sandbox Code Playgroud)
这很好用,大部分时间......
但是,如果用户将浏览器打开一段"重要"时间,然后快速连续执行以下步骤:
他们得到一个例外,通知他们防伪令牌未提供或无效.
我不明白为什么会这样:View(包含表单)是在浏览器处于休眠状态之后创建的,因此防伪标记应该都是"新鲜的".但是,这个设计显然有问题,但我不确定如何最好地纠正它.
如果您有任何建议,请提前致谢.
格里夫
Gen*_*ick 15
我正在处理同样的问题,虽然我理解这个问题,但我还不确定最佳解决方案.
Anti-ForgeryToken进程在表单中放置一个输入值,其中第二个值存储在cookie RequestVerificationToken中.这两个都提交给服务器,如果它们不匹配,则抛出错误.
RequestVerficationToken cookie的到期值设置为Session.因此,当用户长时间在页面上打开浏览器然后提交时,将cookie的时间戳与服务器上的会话超时值进行比较 - 默认值为20分钟左右 - 并且已超出,将被删除因此令牌验证失败.
可能的解决方案,所有这些都有潜在的问题;
| 归档时间: |
|
| 查看次数: |
9813 次 |
| 最近记录: |