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团队. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 可以使用URI模板来匹配URI到路由吗?
- asp.net scriptbundle多个include vs single include
- .NET Core 3.0及ASP.NET Core 3.0 前瞻
- asp.net-mvc-3 – ASP.Net MVC 3:在html.DropDownListFor中
- asp.net-mvc – 无法获取脚本的程序集版本
- asp.net – Microsoft Report Viewer 2010部署
- asp.net-mvc – 实体框架验证的单元测试
- 如何用asp.net页面提供javascript?
- asp.net-mvc – 具有IE条件注释的MVC4捆绑/缩小
- asp.net – 为什么设置AssociatedUpdatePanelId时不会触发U
- asp.net – ASP:ItemTemplate中的DropDownList:
- asp.net-mvc-3 – 分页/排序不适用于部分视图中使
- .net – SqlBulkCopy超时
- 用于Asp.Net应用程序的SSO的最佳方法,从具有多个
- asp.net-mvc – 用于多个复选框表单的ASP.Net MV
- asp.net-mvc – 官方的“如何”MVC编辑器/显示模
- Razor Page Library:开发独立通用RPL(内嵌wwwr
- ASP.Net/web.config – “条目’x’已经输入”?
- asp.net-mvc – ASP.NET MVC和ViewState
- 一步一步创建ASP.NET MVC5程序[Repository+Autof