在网上搜寻了好久看了不少关于MAC验证视图状态失败的解决方法。大部分人都说是在页里或web.config里加web
EnableEventValidation="false" EnableViewStateMac="false" ViewStateEncryptionMode="Never" 这些属性的设算法
置。可是这并不从根本上解决问题,相反这样作了反而更加不安全。安全
为了解决问题我继续收集资料,不经意的发现了一个网页里讲到一个Blog系统从NET1.1升级到NET2后,以前所生服务器
成的全部cookies将会失效,由于NET2和NET1使用的machineKey不同。哈哈,真是恍然大悟啊!cookie
WEB应用中常常遇到采用集群或负载均衡交换机等方式实现多服务器共同对外提供服务,分担压力。在这样的环境下网络
若是Asp.Net程序执行时碰到以下中文错误:app
“验证视图状态 MAC 失败。若是此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的负载均衡
validationKey 和验证算法。不能在群集中使用 AutoGenerate。”this
或以下英文错误:加密
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验证是能够解决问题,但这不是根本的,起码是牺牲了必定的安全性!