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

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

=============================== 

解决方案(1)

处理页面增加

<%@ Page Language="C#"  enableViewStateMac="false" %>

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

其它不需要

如果不再遇到视图状态错误, 问题是否与 MAC 功能。 要点 仅关闭视图状态 MAC 功能以帮助诊断问题。 不应将视图状态 MAC 关闭要解决问题。 如果这样, 则可能引入安全漏洞。 有关详细信息, 请访问以下 MSDN 网站:

http://msdn2.microsoft.com/en-us/library/aa302388.aspx (http://msdn2.microsoft.com/en-us/library/aa302388.aspx)

如果, 关闭视图状态 MAC 功能并使用您对于执行不 HTML 控件视图状态编码 (例如, Label 控件), 攻击者可查看状态数据篡改并可放置任意数据以视图状态。 此任意数据解码和它们显示投递页面时再使用由控件。 因此, 攻击可注入到应用程序除非您工作以防止攻击脚本。 例如, 攻击者可能解码数据、 入然后和 Label 控件是, 数据链接插入到脚本从 Web 站点。 任何用户单击链接上应受害者的脚本注入攻击, 可能潜在窃取其身份验证 Cookie 或会话 ID。 脚本还可能让攻击改变控件使用视图状态状态数据和应用程序特定攻击可能发生作为结果。 一般, Microsoft 建议, 您视图状态 MAC 功能除非您是完全相信有对于执行不 HTML 所有控件或者禁用视图状态不关闭编码其输出 (例如, DataGrid 控件、 DataList 控件、 Label 控件和其他控件) 或, 根据每个请求成知会是安全始终明确设置值。 有关详细信息, 请单击下列文章编号, 查看 Microsoft 知识库文章中文章:

316920 (http://support.microsoft.com/kb/316920/) 使用 Server.Transfer 方法时收到 " 视图状态无效 " 错误信息
324488 (http://support.microsoft.com/kb/324488/) 表单身份验证和视图状态负载间歇性失败

enableViewStateMac="false"

官方网站

http://support.microsoft.com/kb/829743/zh-cn

 

==========================================

解决方案(2)推荐,测试不成功,暂不知原因

如果你的Asp.Net程序执行时碰到这种错误:“验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保  <machineKey> 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate。”那么说明你没有让你的应用程序使用统一的machineKey,那么machineKey的作用是什么呢?按照MSDN的标准说法:“对密钥进行配置,以便将其用于对 Forms 身份验证 Cookie 数据和视图状态数据进行加密和解密,并将其用于对进程外会话状态标识进行验证。”也就是说Asp.Net的很多加密,都是依赖于machineKey里面的值,例如Forms 身份验证 Cookie、ViewState的加密。默认情况下,Asp.Net的配置是自己动态生成,如果单台服务器当然没问题,但是如果多台服务器负载均衡,machineKey还采用动态生成的方式,每台服务器上的machinekey值不一致,就导致加密出来的结果也不一致,不能共享验证和ViewState,所以对于多台服务器负载均衡的情况,一定要在每台站点配置相同的machineKey。  machineKey生成的算法:  validationKey = CreateKey(20);  decryptionKey = CreateKey(24);      protected string CreateKey(int len)      {              byte[] bytes = new byte[len];              new RNGCryptoServiceProvider().GetBytes(bytes);                StringBuilder sb = new StringBuilder();                for(int i = 0; i  < bytes.Length; i++)                {                      sb.Append(string.Format("{0:X2}",bytes[i]));                }                return sb.ToString();      }  附参考的matchineKey配置:  <?xml version="1.0"?>  <configuration>    <system.web>      <machineKey validationKey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77" decryption="3DES" validation="SHA1"/>        </system.web>  </configuration> 你写一个页面来调用这个生成machineKey的函数,然后再每台服务器上运行这个页面看看这个值是什么,然后在根据这个值来配置各个服务器

========================

产生MAC

http://www.aspxboy.com/mk/default.aspx

<machineKey validationKey="B8CEF0C74E23E7197FCC4C9E3617C0007D94D43C7F7A79C582C54B95D69B946DFD49CAF5AA72F9A8CA2CBA040A9DF64DC1DF90DAE1214AE4F1AB7FA56DD65C0D" decryptionKey="D7F1CE31847C4FB31EF51E14F3820D52B659AF8523FC932C03506CC075DB8B28" validation="SHA1" decryption="AES" />

 

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值