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


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

    来源 https://www.cnblogs.com/Setme/archive/2012/06/05/2537084.html

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

    其余方法   

    在web.config中的pages节点上添加enableviewstatemac=false 

    附带:

              一般而言是因为你的某些操作修改了视图状态,我猜测你可能使用了ajax并在客户端用javascript动态添加了某些项

    1. 在出错页面的 <%@ page %>中加enableviewstatemac="false"无效。 
    2. 在web.config的 <system.web>节中加

    <machineKey validationKey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77" decryption="3DES" validation="SHA1"/>

    我的问题是加入:

    <machineKey validationKey="d41d8cd98f00b204e9800998ecf8427e0e5798a7e2c46b2fd4f0277bceaf08e1" validation="SHA1"/> 

    解决

    最重要的是检查自己的页面,很可能是你的页面中的问题,多注意下,肯定能发现问题,而这个问题并没有报出你想要的错误 !!!      

    所以,不一定所有的解决方案都适合你!!!

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

    当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、添加enableEventValidation="false" enableViewStateMac="false"

    或在webconfig中添加<pages enableEventValidation="false" enableViewStateMac="false" />

    3、在webconfig中添加:<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="提交" />

    ============================ End

  • 相关阅读:
    Openlayer 3 的画图测量面积
    Openlayer 3 的画线测量长度
    屏幕尺寸
    px和em,rem的区别
    水平和垂直居中
    Flex布局
    继承的几种方法及优缺点
    call ,apply 和 bind的用法与区别
    mybatis springmvc velocity的demo
    正则同时包含两个关键字
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/9668931.html
Copyright © 2020-2023  润新知