【问题标题】:ASP.NET Validation of viewstate MAC failed视图状态 MAC 的 ASP.NET 验证失败
【发布时间】:2011-06-07 01:42:32
【问题描述】:

我有一个 listView 来显示数据列表。一切都很好,突然我们收到以下错误消息:

视图状态 MAC 验证失败。如果 此应用程序由 Web 托管 场或集群,确保 配置指定相同 验证密钥和验证 算法。无法使用自动生成 在集群中。无效的视图状态。客户 IP ...用户代理:Mozilla/4.0 (兼容;MSIE 7.0;Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.3) 视图状态:

谁能指导我解决这个问题。请注意: 1. 我们的 IIS 服务器是独立的,不是农场的。

更新: ListView 具有指向用户可以单击的记录的超链接。 非常感谢。

【问题讨论】:

  • 刚刚在测试中遇到此错误,将客户端设置为不允许接受 cookie,并尝试登录应用程序。比较离奇的情况。我的 (win7) localhost 和 win2008 服务器上的行为相同。

标签: asp.net


【解决方案1】:

可能是 IIS 回收了您的应用程序,因此您获得了会话/视图状态的新密钥。为了缓解这种情况,请在 web.config 中添加机器静态密钥。

http://www.eggheadcafe.com/articles/GenerateMachineKey/GenerateMachineKey.aspx生成密钥

并将密钥放在您的 web.config 示例中,如下所示

<machineKey
validationKey="56AB7132992003EE87F74AE4D9675D65EED8018D3528C0B8874905B51940DEAF6B85F1D922D19AB8F69781B2326A2F978A064708822FD8C54ED74CADF8592E17"
decryptionKey="A69D80B92A16DFE1698DFE86D4CED630FA56D7C1661C8D05744449889B88E8DC"
validation="SHA1" decryption="AES" />

&lt;machineKey&gt; 应该放在 &lt;system.web&gt; 部分内。

【讨论】:

    【解决方案2】:

    我认为问题出在Different keys across postback,所以你需要生成新的加密密钥。

    来自代码项目:

    ASP.NET 使用两个键 加密、解密和验证数据 在 ViewState 中,表单身份验证 票证和进程外会话 数据。解密密钥用于 加密和解密 身份验证票和加密 查看状态信息。这 validationKey 用于验证 ViewState 并确保它没有 篡改,并产生独特的 特定于应用程序的会话 ID 进程外会话存储。 如果回发之间的密钥发生变化,您可能会遇到问题。


    一篇很好的文章如何做到这一点herehereherehere

    一般来说,迁移到生产环境时需要考虑一些问题。

    一篇关于这个here的好文章。

    【讨论】:

      【解决方案3】:

      不知道您的应用的具体细节,如果页面在完全加载之前提交,可能会发生这种情况。您可以通过使用 javascript 来解决在页面完全加载之前防止回发/提交的问题。如果可能,还要尝试减小页面的大小。禁用您不使用的任何控件的视图状态。

      【讨论】:

      • ListView 有超链接到用户可以点击的记录。
      • Mozilla 浏览器是否会导致此问题??
      【解决方案4】:

      这可能发生在其他情况下,即在Sql命令执行完成之前发生池回收,当您的应用程序处理大量数据处理时(此类报告生成..等)。检查您的应用程序的应用程序池并增加回收间隔。

      【讨论】:

        【解决方案5】:

        这可能会对您有所帮助:

        <%@ Page EnableViewStateMac="false" Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
        

        注意:EnableViewStateMac="false"

        【讨论】:

        • 你能解释一下它有什么帮助吗?
        • 不应该这样做。如果将其设为 false,ASP.NET 将停止检查 ViewState 是否已被篡改。这就像邀请黑客入侵您的应用程序一样。
        • 如果您的安全系统给您误报是修复安全系统关闭它并希望最好的正确解决方案?
        • 我只需要重申:永远不要这样做。
        猜你喜欢
        • 1970-01-01
        • 2011-08-16
        • 1970-01-01
        • 1970-01-01
        • 2010-09-24
        • 2011-12-18
        相关资源
        最近更新 更多