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

  异常详细信息: 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验证错误。

  当runat="server"的表单通过修改action提交数据到其它页面时,会引发这个问题。例如:

document.forms[0].action = "AttachmentAdd.aspx";
document.forms[0].submit();

  主要的原因是提交了名为__VIEWSTATE的数据,ASP.NET的验证视图状态的时候失败。

  有提交前禁用__VIEWSTATE即可:

$("#__VIEWSTATE").attr("disabled", true);
document.forms[0].action = "AttachmentAdd.aspx";
document.forms[0].submit();

  以下是网络上其它解决这个问题的建议:

  1、去掉 runat="server"

  2、在当前页面Page指令添加

enableEventValidation="false" enableViewStateMac="false"

  或在webconfig的<system.web>节添加:

<pages enableEventValidation="false" enableViewStateMac="false" />

  3、【推荐在webconfig的<system.web>节添加

<machineKey validation="3DES" validationKey="319B474B1D2B7A87C996B280450BB36506A95AEDF9B51211" decryption="3DES" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A87" />

  参考:

  MSN 上关于machinekey:

http://msdn.microsoft.com/zh-cn/library/w8h3skw9(v=VS.80).aspx

http://msdn.microsoft.com/zh-cn/library/dtkwfdky(v=VS.80).aspx

  4、不使用跨页面提交,提交到本页后在page.load中redirect.

  5、使用

<asp:Button runat="server" PostBackUrl="~/Register/DoRegister.aspx" Text="提交" />

  有关MachineKey的官方文档,请访问这里:http://msdn.microsoft.com/zh-cn/library/ms998288(en-us).aspx

原文地址:https://www.cnblogs.com/dudumao/p/2948906.html