专栏首页james大数据架构Validation of viewstate MAC failed 解决办法

Validation of viewstate MAC failed 解决办法

大部分人都说是在页里或web.config里加EnableEventValidation="false" EnableViewStateMac="false" ViewStateEncryptionMode="Never" 这些属性的设置。但是这并不从根本上解决问题,相反这样做了反而更加不安全。

为了解决问题我继续收集资料,不经意的发现了一个网页里讲到一个Blog系统从NET1.1升级到NET2后,之前所生成的所有cookies将会失效,因为NET2和NET1使用的machineKey不一样。哈哈,真是恍然大悟啊!

 WEB应用中经常遇到采用集群或负载均衡交换机等方式实现多服务器共同对外提供服务,分担压力。在这样的环境下,如果Asp.Net程序执行时碰到如下中文错误:

“验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的validationKey 和验证算法。不能在群集中使用 AutoGenerate。”

或如下英文错误:

Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey> configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.

则说明多台WEB服务器上的WEB应用程序没有使用统一的machineKey导致的。

       那么machineKey的作用是什么呢?

按照MSDN的标准说法:“对密钥进行配置,以便将其用于对 Forms 身份验证 Cookie 数据和视图状态数据进行加密和解密,并将其用于对进程外会话状态标识进行验证。”

也就是说Asp.Net的很多加密,都是依赖于machineKey的设置,例如Forms 身份验证 Cookie、ViewState的加密。默认情况下,Asp.Net的配置是自己动态生成,validationKey和decryptionKey的默认值是AutoGenerate。如果单台服务器当然没问题,但是如果多台服务器负载均衡,machineKey还采用动态生成的方式,每台服务器上的machinekey值不一致,就导致加密出来的结果也不一致,不能共享验证和ViewState,所以对于多台服务器负载均衡的情况,一定要在每台站点配置相同的machineKey。

至此真相水落石出,立刻在web.config中添加关于machineKey的配置项,并手动设置其中的密钥值,这里请注意,不同加密算法对于密钥的最大字符长度是不同的,在这里能够使用的有AES,DES,3DES,SHA1,MD5,我只知道DES的密钥字符长度为16,3DES长度为48,手动设置时密钥长度必须等于其最大长度,否则会出错!至于密钥的16进制值可以随便输入。

参考的web.config 中matchineKey配置:

<system.web>               <machineKey validation="3DES" validationKey="319B474B1D2B7A87C996B280450BB36506A95AEDF9B51211"

         decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A87" decryption="3DES"/>       </system.web>

       好了,问题得已解决!希望广大朋友遇到MAC验证视图状态失败的问题的时候,不要马上把EnableViewStateMac="false"设置成这样就完事了。先分析什么原因导致了这个错误的发生,禁用掉EnableViewStateMac验证是可以解决问题,但这不是根本的,起码是牺牲了一定的安全性!

注意:实际使用时报错

此时按照提示将validation换成SHA1就OK了

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 备胎的养成记KeepAlived实现热备负载

      在  入坑系列之HAProxy负载均衡 中已经详细讲过了怎么将高并发的请求按均衡算法分发到几台服务器上做均衡防止单机崩溃。   但这样的话有没有发现所有请求...

    欢醉
  • 聚合索引(clustered index) / 非聚合索引(nonclustered index)

    以下我面试经常问的2道题..尤其针对觉得自己SQL SERVER 还不错的同志.. 呵呵 很难有人答得好.. 各位在我收集每个人擅长的东西时,大部分都把SQL...

    欢醉
  • Android 2.x中使用actionbar - Actionbarsherlock

    1. 范例说明 从Android 3.0开始,Android引入了ActoinBar,不得不说3.0之前android的标题栏确实比较丑,并且还没有任何功能。...

    欢醉
  • 一图看懂腾讯安全新一代云防火墙

    伴随企业核心业务大量上云 云端业务系统对外暴露出更多的攻击面 如何智能拦截木马病毒和漏洞攻击? 如何识别恶意的主动外联行为并自动阻断? 如何实现有效防御,让云...

    腾讯云安全
  • 这一次,彻底理解JavaScript深拷贝

    要理解JS中数据是如何存储的,就要先明白其内存空间的种类。下图就是JS的内存空间模型。

    dellyoung
  • 我的 Sublime Text 必备插

    Sublime Text有一个缺点,当你想使用浏览器浏览你的html页面的时候,你需要在你的文件上点击鼠标右键,选择Open In Browser才可以浏览器浏...

    py3study
  • HP 3PAR产品线

      HP收购3PAR后停产了F-class、T-class,推出全新的 7200、7400、V400、V800。其中V400、V800在HP整个存储产品线中定...

    py3study
  • 第二节,Vuex生成Store并映射数据到view视图层

    (1)通过辅助函数mapGetters,从vuex的getters中获得state里面的数据,

    web前端教室
  • CMake创建C++项目

    CMake是一个高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile或者vcproj项目,也就是说它最大的优势就是跨平台。

    fem178
  • 钉钉的开工利是,会成为企业级市场的双11吗?

    利是又称利事,即红包,是中国文化传统的一种社交行为。现在,新年开工第一天,很多中国公司也形成了派开工利是的风俗,比如马化腾携高管亲自给员工发红包已成为腾讯的传统...

    罗超频道

扫码关注云+社区

领取腾讯云代金券