验证视图状态 MAC 失败,解决方法,验证视图状态mac失败解决方式视频讲解
验证视图测量与控制(测量和控制)失败视图状态测量与控制(Measurement and Control)验证失败
今天在调试阿特拉斯时遇到错误:
验证视图测量与控制(测量和控制)失败。如果此引用程序由网络场或群集承载,请确保机器钥匙配置指定了相同的验证密钥和验证算法。不能在群集中使用自动生成
发生错误的环境:
ASP .NET 2.0,使用阿特拉斯的更新面板,在更新区域中动态加载用户控件,以达到动态更新页面的效果。其中有一个用户控件中使用了网格视图。当动态切换页面时,出现上述错误。
问题分析:
经过一番搜索,找到以下的文章:
http://aspadvice。com/blogs/jote ke/archive/2006/02/02/15011。文件
http://forums.asp.net/1173230/ShowPost.aspx
分析后找到了问题的根源。首先,文章中提到,如果用网格视图,并且指定了DataKeyNames属性,则出于安全的理由(因为DataKeyNames指定的字段代表数据的主键,且该主键值需要保存在视图状态中发送到客户端,用户如果篡改主键值,会导致安全问题),网格视图会要求加密视图状态。为此会自动在页面表单/表单之前添加一个输入type= hidden name= _ _ viewstate encrypted id= _ _ viewstate encrypted value= /。
然而,图集的更新区域要求放置在表格/表格内部,也就是/表单之前。这就意味着添加的隐藏投入控件没有被放置在更新区域内,而是放置在更新区域和/表单之间。
当更新区域更新时,更新面板内部的控件被提交到服务器进行处理(父系渲染),而整个页面并没有被提交。也就是说隐藏的投入控件没有随着一起提交。因此服务器并不知道提交的视图状态被加密了,从而导致测量与控制(测量和控制)验证错误。
解决方法:
通过在网页配置里边添加
pages enableEventValidation= false viewStateEncryptionMode= Never /
可以解决该问题。
ASP .NET 2.0和"视图状态苹果个人计算机验证失败"异常
如果你得到这个异常
[http异常(0x 80004005):视图状态MAC验证失败。如果此应用程序由网场或群集承载,请确保机器钥匙配置指定了相同的验证密钥和验证算法。自动生成不能在集群中使用。]
和
你肯定知道你没有使用网络农场
它似乎出现在使用内置数据绑定控件时,如GridView、细节视图或表单视图,这些控件利用了DataKeyNames .
如果你有一个很大的页面,由于某种原因加载很慢,它就会出现
如果以下前提条件为真,并且您在页面尚未完全加载时单击了回发控件/链接,您可能会得到“视图状态MAC验证失败"异常。在这种情况下,请务必查看ASP。网论坛上的以下帖子,在那里已经对此进行了彻底的讨论:http://forums . ASP . net/1173230/show post . aspx
它之所以出现,是因为使用DataKeyNames的显示数据表格(一种控件)要求加密视图状态.当视图状态加密时,第页在关闭形式标记之前添加输入type= hidden name= _ _ ViewState encrypted id= _ _ ViewState encrypted value= /字段。但是这个隐藏字段可能还不能更好地呈现给具有长时间运行的页面的浏览器,如果您在它"关闭"之前进行回发,浏览器将在没有这个字段的情况下启动回发(在窗体邮政集合中)
最终结果是,如果在回发时省略了该字段,则页不"知道"视图状态是加密的,从而导致前面提到的异常。例如,在您回发之前,第页希望完全加载。顺便说一下,事件验证也有类似的问题,因为_ _事件验证字段也呈现在表单的末尾。
要克服这个问题,需要在网页配置页面中设置enableEventValidation= false viewStateEncryptionMode= Never /注意这些安全隐患!
在預設狀況ASP .网會隨機建立曼奇尼凯當作驗證碼,
配置
system.web
计算机密钥验证密钥=自动生成,隔离应用程序
decryptionKey=AutoGenerate,IsolateApps validation=SHA1/
/system.web
/配置
若你有兩台网服务器,當另一台要驗證视图状态時,
验证密钥或解密密钥必須是相同的,所以必須自行產生验证密钥後,
才能以相同的驗證碼來處理视图状态甚至甜饼干等。
產生驗證碼的方法如下:
字符串验证键=GetKey(30);//20~64均可
字符串解密密钥=GetKey(30);//20~64均可
受保护的字符串GetKey(int Keylen)
{
字节[]字节=新字节[密钥长度];
新的RNGCryptoServiceProvider().GetBytes(字节);
StringBuilder Builder=new StringBuilder();
for(int I=0;我字节。长度;我)
{
建筑商。追加(字符串格式( {0:X2} ,字节[I]);
}
返回生成器ToString();
}
產生後即可在每台网络服务器網站的网络。配置加上机器钥匙即可,如下
配置
system.web
机器密钥验证密钥= 3 ff1e 929 BC 0534950 b 0920 a7b 59 fa 698 BD 02 dfe 8
解密密钥= 280450 bb 36319 b 474 c 996 b 506 a 95 aed F9 b 51211 B1 D2 B7 a 77
解密=3DES 验证=SHA1/
/system.web
/配置