验证视图状态MAC失败的解决办法
来源:互联网 发布:免费查重软件 编辑:程序博客网 时间:2024/06/04 08:48
您用的是ASP.net服务器吧?如果你的Asp.Net程序执行时碰到这种错误:“验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate。”那么说明你没有让你的应用程序使用统一的machineKey,那么machineKey的作用是什么呢?按照MSDN的标准说法:“对密钥进行配置,以便将其用于对 Forms 身份验证 Cookie 数据和视图状态数据进行加密和解密,并将其用于对进程外会话状态标识进行验证。”也就是说Asp.Net的很多加密,都是依赖于machineKey里面的值,例如Forms 身份验证 Cookie、ViewState的加密。默认情况下,Asp.Net的配置是自己动态生成,如果单台服务器当然没问题,但是如果多台服务器负载均衡,machineKey还采用动态生成的方式,每台服务器上的machinekey值不一致,就导致加密出来的结果也不一致,不能共享验证和ViewState,所以对于多台服务器负载均衡的情况,一定要在每台站点配置相同的machineKey。 machineKey生成的算法: validationKey = CreateKey(20); decryptionKey = CreateKey(24); protected string CreateKey(int len) { byte[] bytes = new byte[len]; new RNGCryptoServiceProvider().GetBytes(bytes); StringBuilder sb = new StringBuilder(); for(int i = 0; i < bytes.Length; i++) { sb.Append(string.Format("{0:X2}",bytes[i])); } return sb.ToString(); } 附参考的matchineKey配置: <?xml version="1.0"?> <configuration> <system.web> <machineKey validationKey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77" decryption="3DES" validation="SHA1"/> </system.web> </configuration>要是看不明白的话可以参考:http://blog.csdn.net/huwei2003/archive/2009/10/09/4647008.aspx
参考资料: http://blog.csdn.net/huwei2003/archive/2009/10/09/4647008.aspx
===================================================
在网上搜寻了很久看了很多关于MAC验证视图状态失败的解决方法。大部分人都说是在页里或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验证是可以解决问题,但这不是根本的,起码是牺牲了一定的安全性!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liu_zhongjie/archive/2010/02/05/5290365.aspx
- 验证视图状态MAC失败的解决办法
- 验证视图状态MAC失败的解决办法
- 验证视图状态MAC失败的解决办法
- 验证视图状态 MAC 失败的解决办法
- 验证视图状态 MAC 失败的解决办法
- 验证视图状态 MAC 失败的解决办法
- 验证视图状态 MAC 失败的解决办法
- 验证视图状态 MAC 失败的解决办法
- 验证视图状态 MAC 失败错误解决办法
- 验证视图状态MAC失败问题正确的解决办法
- ASP.NET视图状态验证MAC失败 解决办法
- 验证视图状态 MAC 失败
- 验证视图状态 MAC 失败
- 验证视图状态 MAC 失败
- 验证视图状态 MAC 失败
- 验证视图状态 MAC 失败
- 验证视图状态 MAC 失败
- 验证视图状态 MAC 失败
- C++虚函数表解析
- 我推崇的流行唱法:美國Speech Level Singing的介紹和討論(推荐)
- J.U.C包介绍
- 首次注册
- C++一个特殊的引用
- 验证视图状态MAC失败的解决办法
- 《.NET 4.0面向对象编程漫谈》读者请进
- a+++b 在编译基础上的一点点讨论
- Android APN设置及获得手机号
- 自我催眠
- C/C++中的回调函数
- 培训总结
- 动态规划--双调欧几里得旅行商问题
- DataGridView的总结