• 验证视图状态 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

  • 相关阅读:
    Go实现线程池
    Go语言工程结构
    Go语言示例-函数返回多个值
    Go语言参数中的三个点是干什么的
    go语言示例-Timer计时器的用法
    Go语言的类型转化
    iOS 修改通讯录联系人地址(address)崩溃原因分析
    tableview小结-初学者的问题
    Objective-C总Runtime的那点事儿(一)消息机制
    论坛源码推荐(11.6):iPhone6/6 plus屏幕适配Demo,Java代码转Objective-C
  • 原文地址:https://www.cnblogs.com/dudumao/p/2948906.html
Copyright © 2020-2023  润新知