加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 即使使用静态机器密钥,HttpAntiForgeryException

发布时间:2020-12-15 23:35:46 所属栏目:asp.Net 来源:网络整理
导读:我们有一个在Windows Azure(最新的2.x操作系统版本)上运行的ASP.NET MVC 2(.NET 4)应用程序,具有两个Web角色实例. 我们使用MVC为所有POST请求提供的防伪令牌,并且我们在web.config中设置了一个静态机器密钥,所以一切都可以在多台机器上重新启动. 99.9%的案
我们有一个在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团队.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读