【问题标题】:"Validation of viewstate MAC failed. If this application is hosted by a Web Far..."“视图状态 MAC 验证失败。如果此应用程序由 Web Far 托管...”
【发布时间】:2011-09-08 13:49:52
【问题描述】:

我正面临着可怕的:

视图状态 MAC 验证失败。如果此应用程序由 Web Farm 或集群托管,请确保配置指定相同的 validationKey 和验证算法。 AutoGenerate 不能在集群中使用。

错误。

好的,所以我查了一下,发现它可能是由两件事引起的,页面无法验证的 viewState 和/或无法验证的事件。

我放了

<pages enableEventValidation="false" enableViewStateMac="false" viewStateEncryptionMode="Never">

在我的 web.config 中解决问题,但这对我来说似乎很难解决。

问题是,我什至从未在我的应用程序中使用过 viewState。我知道asp.net默认使用viewstate来存储一些东西,但是我怀疑这里存储的默认值会导致任何错误。

我注意到问题似乎发生在我 postBack 并且页面尚未完成加载时。

谢谢

编辑:请有人测试我的网站 www.vittoriosaStarsNursery.com 看看你是否收到我上面遇到的错误?我在本地没有得到它,但人们一直告诉我他们得到它。

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    这不仅仅是在您的 web.config 中放置一个衬里的情况

    <machineKey decryptionKey="A4B12CCDD50E95F8GB9GFH6JKAT4Y0U0I2OF2DF2AAFE5AB46189C,IsolateApps" validation="AES" validationKey="480CDF2AS9S9AS5CFDGF0GHFH9JJH4KHKAKLJ2L9F3SAS82A6C16911A29EF48903783F94529C21570AACB72766FB38CD4CE7B85B0ACE3149DC5FC1CCF1AA1CECE3579659996593B06,IsolateApps"/>
    

    【讨论】:

    • 那是什么?它与IIS有关吗?我在研究这个问题时遇到了这个问题
    • 这是 IIS 用来加密和解密视图状态的加密代码和方法。如果你没有它们,那么当一个新会话开始时,它会生成它们并将它们存储在 RAM 中,场中的其他服务器显然无法读取,因此不知道解密视图状态的代码
    • 应该注意的是,您应该将这些代码保密,因为黑客可能会使用它们编辑您的视图状态并弄乱您的后端......因此为什么只复制和粘贴我粘贴的行不会工作:)您可以通过进入 IIS 自己生成它们,单击您的网站并单击生成密钥 (IIS7)
    • 但是如果我什至没有在我的项目中使用 ViewState 怎么办?更别说加密了!
    • viewstate 是任何 aspx 页面的一部分,默认情况下是加密的
    【解决方案2】:

    我遇到的导致此问题的一件事与网络服务器上应用程序池的回收间隔有关。

    我通过查看事件查看器/应用程序日志中的事件信息和称为“Web 事件”的“任务类别”发现了这一点。然后在此事件发生的时间段内,我查看是否有任何在此之前发生的回收事件(事件查看器/系统日志和称为“WAS”的“源”。

    默认情况下,应用程序池将每 1740 分钟(29 小时)回收一次。如果此回收发生在用户忙于站点并将帖子发送回服务器时,服务器将不再识别会话/视图状态并拒绝回发的内容。

    从我们的角度来看,要克服这个问题,请将回收事件设置为在一天中我们预计网站上没有活动的特定时间发生。在我们的例子中是凌晨 3 点。

    希望能帮助到那里的人。

    【讨论】:

      【解决方案3】:

      你不会喜欢我的回答。这个错误在webforms中基本上是无法避免的。我的解决方案是为 MVC3 和 razor 保留网络表单。

      我注意到问题似乎发生在我 postBack 和 页面尚未加载完毕。

      这是导致此错误的最简单方法之一。在 ASP.NET 3.5(或 4.0)中,有一个设置可以确保视图状态在页面的早期加载,以帮助减少它。还是没解决。

      对视图状态进行分块并不能解决问题。

      Webforms 的工作方式存在一些固有的错误,该错误会在随机时间永远困扰您的应用程序。

      【讨论】:

      • 所以我做错了什么?该死...我也喜欢 asp.net :(
      • 我也一直这样做,但是 MVC3 + razor 至少比 IMO 好 4-5 倍。我的 MVC 应用程序可以持续数天而不向错误日志中添加消息。我的网络表单应用最长的时间是 12 小时。
      • 我的公司制作了一个 SaaS asp.net Web 表单应用程序,当我们在日志中收到错误时,它们几乎总是由我们的代码中的错误引起的。我们很少看到这个错误。
      • @BenRobinson 任何代码、任何级别、任何地方的什么样的错误都可能破坏客户端发回 Web 服务器的加密签名视图状态数据?
      【解决方案4】:

      在我的网站上,这个元标记导致了错误:

      <base href="http://www.SITEURL.COM" />
      

      我有一个下拉菜单,我更新了另一个下拉菜单更改了选择。因此,当回发发生时(下拉 #2 更改索引),我得到了异常。

      我已经尝试了所有其他方法,从将 machinekey 应用到 web.config 并在页面上设置这些属性

      EnableViewState="false" EnableViewStateMac="false"

      【讨论】:

        【解决方案5】:

        我在 Windows Web Server 2008 上使用 VS 2010,我最终发现我在 webconfig 的 appSettings 部分为同一服务设置了两个键。我去 IIS 并检查了虚拟目录上的应用程序设置并得到了一个错误,在 WebConfig 中修复它并解决了问题。我确实创建了一个机器密钥,但这并没有解决问题。

        也没有

        页面 (...) validateRequest="false" enableEventValidation="false" enableViewStateMac="false" viewStateEncryptionMode ="从不"/

        设置。 FWIW ...

        【讨论】:

          【解决方案6】:

          我用这个Microsoft article 创建了我自己的机器密钥验证密钥和解密密钥。正如其他人所说,这可以放在 web.config 的 system.web 部分中,但如果其他人掌握了密钥,则会存在安全问题。

          【讨论】:

            【解决方案7】:

            嗯,是的,我想禁用加密视图状态可以解决问题,但我从未测试过它,也不建议这样做。 Viewstate 存储控件的状态,也非常方便存储持久变量。

            例如,您在车库工作并拥有一份工作清单。您转到列出作业的页面。现在,您单击一个作业,该作业将转到另一个附加作业 ID 的页面(例如 job.aspx?id=1)。在该页面上,有一个复选框将作业标记为完成。勾选该复选框后,它会将数据发送回同一页面并写入作业完成的数据库。但是服务器如何知道将哪个作业标记为完成,因为您只从复选框中发回了 true 或 false。但是,如果您第一次加载作业详情页面时将作业 id 记录在 Viewstate 中,那么当您发布打包复选框时,您可以从 viewstate 中读取作业 ID。

            为什么使用未加密的视图状态不好?

            想象一下服务器必须做什么才能将作业标记为完成。它可能必须运行 sql 命令来更新数据库。类似于 UPDATE jobs SET completed=GETDATE() WHERE id=1.

            如果您的视图状态没有加密,我可以添加自己的工作 ID,我会输入类似 ';从工作中删除;'然后会取消最初的 UPDATE 命令并删除你所有的工作......对车库不是很好:)

            【讨论】:

            • 您为什么使用 ASPX 页面?听起来你可能会更好地使用 php 甚至 shtml :) 页面。
            • 查看状态加密不是那样工作的(我在这里引用一本书),加密意味着你无法读取该值,即使它被禁用,asp.net 会检查该值是否仍然有效。它通过在每个值的末尾附加一个代码来做到这一点,然后在回发时进行比较。用户仍然可以读取该值,但如果他更改它并回发,它将无法正常工作。
            • 好吧。就像校验和。有一种方法可以将视图状态设置为将自身保存到数据库中,这可能会对您有所帮助,但我现在正在度假,所以直到下周才能复制代码。
            • 帮助我的一种方法是查看我刚刚在问题中写的内容:)(在底部)
            猜你喜欢
            • 1970-01-01
            • 2010-09-24
            • 2011-12-18
            相关资源
            最近更新 更多