asp.net-mvc – 即使使用静态机器密钥,HttpAntiForgeryException为什么会随机发生?

我们有一个在Windows Azure(最新的2.x操作系统版本)上运行的ASP.NET MVC 2(.NET 4)应用程序,具有两个Web角色实例.

我们使用MVC为所有POST请求提供的防伪令牌,并且我们在web.config中设置了一个静态机器密钥,所以一切都可以在多台机器上重新启动. 99.9%的案例工作完美.

然而,我们每时每刻记录一个HttpAntiForgeryException,并显示消息“A所需的反伪造标记未提供或无效”.

我知道问题可能是浏览器中不允许使用cookies,但是我们已经验证了Cookie是否被启用并被正确发送.

这种错误发生在各种浏览器上,显然会给用户带来问题,因为他们必须重复操作,否则可能会丢失一些数据.只要说,我们无法在本地重现问题,但只发生在Windows Azure上.

为什么会发生这种情况?我们怎么可以避免呢?

解决方法

我最近也碰到这个,发现了两个原因.

1.浏览器恢复上次打开的页面,被缓存

如果您有一个可高速缓存的页面执行到您的服务器的一个帖子(即防伪将被启用),并且用户的浏览器设置为在启动时恢复上次会话(此选项存在于chrome中),页面将从缓存中呈现.但是,请求验证cookie不会存在,因为它是浏览器会话cookie,并且在浏览器关闭时被丢弃.因为cookie已经消失,你会得到防伪的例外.解决方案:返回响应标头,以使该页面不被缓存(即Cache-Control:private,no-store).

2.竞赛条件如果在您的网站启动时打开多个选项卡

浏览器可以选择在启动时打开一组选项卡.如果您的网站中有超过一个返回请求验证Cookie,您可以在请求验证cookie被覆盖的情况下达到竞争条件.这是因为有多个请求从没有设置请求验证cookie的用户访问您的服务器.处理第一个请求并设置请求验证cookie.接下来第二个请求被处理,但它没有发送cookie(尚未在请求时设置),所以服务器生成一个新的.新的覆盖第一个,现在当该页面一个执行一个帖子时,该页面将获得防伪请求异常. MVC框架不处理这种情况.这个bug已经报告给了微软的MVC团队.

相关文章

这篇文章主要讲解了“WPF如何实现带筛选功能的DataGrid”,文...
本篇内容介绍了“基于WPF如何实现3D画廊动画效果”的有关知识...
Some samples are below for ASP.Net web form controls:(fr...
问题描述: 对于未定义为 System.String 的列,唯一有效的值...
最近用到了CalendarExtender,结果不知道为什么发生了错位,...
ASP.NET 2.0 page lifecyle ASP.NET 2.0 event sequence cha...