WEB开发网
开发学院WEB开发ASP.NET ASP.NET视图状态验证MAC失败 解决办法 阅读

ASP.NET视图状态验证MAC失败 解决办法

 2009-11-03 16:51:00 来源:WEB开发网   
核心提示:asp.net视图状态验证MAC失败 解决办法 验证视图状态 MAC 失败,如果此应用程序由网络场或群集承载,ASP.NET视图状态验证MAC失败 解决办法,请确保 <machineKey> 配置指定了相同的 validationKey 和验证算法,不能在群集中使用 AutoGenerate,因此服务器并不
asp.net视图状态验证MAC失败 解决办法

 

  验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate。
   说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

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

分析:

分析后找到了问题的根源。首先,文章中提到,如果用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 ...>里加两个属性:
enableEventValidation = " false " viewStateEncryptionMode = " Never "


2.当然还可以在web.config里加入:(<system.web>之间)
< pages enableEventValidation = " false " viewStateEncryptionMode = " Never " /> 

Tags:ASP NET 视图

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接