“对viewstate MAC的验证失败。如果此应用程序由Web Far托管......”

时间:2011-09-08 13:49:52

标签: asp.net

我正面对可怕的事情:

对viewstate MAC的验证失败。如果此应用程序由Web场或群集托管,请确保配置指定相同的validationKey和验证算法。 AutoGenerate无法在群集中使用。

错误。

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

我把

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

在我的web.config中停止问题,但这似乎不适合我。

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

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

由于

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

7 个答案:

答案 0 :(得分:11)

这不仅仅是在你的web.config中添加一个内容的案例

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

答案 1 :(得分:2)

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

我通过查看Eventviewer / Application日志中的事件信息和名为“Web Event”的“任务类别”找到了这个。然后,对于发生此事件的时间段,我查看是否在此之前发生了任何回收事件(事件查看器/系统日志和“源”称为“WAS”。

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

从我们的角度来看,要解决这个问题,就是将回收事件设置为在我们不期望网站上的活动的某一天的特定时间发生。在我们的情况下凌晨3点。

希望帮助那里的人。

答案 2 :(得分:0)

你不会喜欢我的回答。这种错误在webforms中基本上是不可避免的。我的解决方案是将MVforms留给MVC3和razor。

  

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

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

组织视图状态并不能解决问题。

webforms工作的方式本身就存在一些错误,这个错误会在随机的时间里永远困扰你的应用程序。

答案 3 :(得分:0)

在我的网站上,此元标记导致错误:

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

我有一个下拉列表,我更新了另一个下拉列表更改选择。所以当回发发生时(下拉列表#2改变了索引),我得到了例外。

我已尝试过将machinekey应用到web.config并在页面设置theese属性的所有其他内容

EnableViewState="false" EnableViewStateMac="false"

答案 4 :(得分:0)

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

也没有
  

pages(...)validateRequest =“false”enableEventValidation =“false”   enableViewStateMac =“false”viewStateEncryptionMode =“Never”/

设置。 FWIW ......

答案 5 :(得分:0)

我使用这个Microsoft article来创建我自己的machineKey validationkey和decryptionKey。正如其他人所说的那样,这可以放在web.config的system.web部分中,但如果其他人掌握了密钥,则存在安全问题。

答案 6 :(得分:-1)

嗯,是的,我认为禁用加密的viewstate可以解决问题,但我从来没有测试过,也没有建议。 Viewstate存储控件的状态,也非常方便存储持久变量。

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

为什么使用未加密的viewstate不好?

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

如果您的视图状态未加密,我可以添加自己的工作ID,我会添加类似';从作业中删除;'这将取消最初的UPDATE命令并删除所有你的工作...对于车库来说不是很好:)。