验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 配置

在.net的网站程序中有时要报这样的错误:验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 配置


那么我们来看看具体的原因:

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

原因分析:
这个问题以前基本没有遇到过,这次莫名其妙的出现。查了点资料其实原理挺简单:就是通过XMLHttpRequest把文本输入框内输入的内容传送给后台处理页面,后台处理完之后通过回调函数取得值,然后再把值输出在信息提示层上。
如果用GridView,并且指定了DataKeyNames属性,则出于安全的理由(因为DataKeyNames指定的字段代表数据的主键,且该主键值需要保存在视图状态中发送到客户端,用户如果篡改主键值,会导致安全问题),GridView会要求加密视图状态。为此会自动在页面表单</forms>之前添加一个<input type="hidden" name="__VIEWSTATEENCRYPTED" id="__VIEWSTATEENCRYPTED" value="" /> 。 
然而,Atlas的UpdatePanel要求放置在<form></form>内部,也就是</form>之前。这就意味着添加的隐藏input控件没有被放置在UpdatePanel内,而是放置在UpdatePanel和</form>之间。
当UpdatePanel更新时,UpdatePanel内部的控件被提交到服务器进行处理(Patrial Rendering),而整个页面并没有被提交。也就是说隐藏的input控件没有随着一起提交。因此服务器并不知道提交的ViewState被加密了,从而导致MAC验证错误。

具体解决方法:
1、 单页面解决方法:
直接在问题页面开头加入一个属性。
<%@ page language="C#" EnableViewStateMac= "false"%>
2、 当多页面出现问题时其解决方法:
在web.config文件中的添加
<configuration>
<appSettings>
添加的设置在此处
</system.web>
</configuration>

添加内容为:
<machineKey validationKey="C3DD5E21134BDCAF7D951A2ED8E45F7E7395A8CEBAA6A43A8D8528A85B9AB00D" decryptionKey="ADCBCFC864936D0248917F2CF276E6F392F5A202F1DB53D9" validation="MD5" />

或者

<machineKey validationKey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77" decryption="3DES" validation="SHA1"/>
在配置文件中,在“添加的设置在此处”添加上上面的一条就OK!