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-mvc – 在ASP.NET MVC中的JSON属性中返回呈现的HTM
- asp.net – 在web.config中添加程序集引用
- asp.net-mvc – asp.net mvc排除来自搜索引擎抓取的动作
- ASP.NET jQuery错误:未知的Web方法
- 如何在ASP.NET自定义控件中持久保存List属性?
- asp.net-mvc – 从页面到局部视图的asp.net mvc参数
- asp.net – 需要有关选择数据访问方法的建议
- asp.net-mvc – DNX vs DNX Core
- asp.net-mvc – 我应该使用AsyncController在ASP.NET MVC 4
- asp.net – Request.ServerVariables [“REMOTE_ADDR”]足够
- 如何动态地从ASP.NET MVC控制器获取数据到jQuery
- asp.net-mvc-4 – 如何在视图页面上缩小脚本块内
- asp.net-mvc – 当我不知道内容类型时如何返回文
- 在ASP.Net应用程序中执行Server.MapPath的最有效
- asp.net-mvc-4 – ASP.NET Web API的自定义MVC A
- ASP.NET MVC通过ActionLink传递模型
- asp.net – IIS Web Garden中的Singleton对象
- 如何通过ASP.NET中的另一个下拉列表过滤下拉列表
- asp.net-mvc – 免费.Net云主机与SQL Server数据
- asp.net-mvc – Bug? ASP.NET MVC 2中的客户端验
