在页面上停留20多分钟后,查看状态MAC验证失败

时间:2011-01-14 16:31:59

标签: asp.net iis-7 asp.net-2.0 asp.net-3.5 viewstate

如果您在我们服务器上托管的某个网站上打开网页,请将其保留20分钟,然后提交表单,则会发生Validation of viewstate MAC failed.错误。

可能有什么理由呢?

5 个答案:

答案 0 :(得分:12)

出现这种情况有几个原因:

自动生成的计算机密钥:

如果您的应用程序池具有20分钟的默认空闲超时并且您正在使用自动生成的验证和解密密钥,那么每次池启动时它将生成一组新的密钥。这会使浏览器的加密视图状态无效。您还会发现持久性票证的表单身份验证票证也将变为无效。

要克服此问题,请将这些键设置为固定值:

`c:\%systemroot%\microsoft.net\framework\v2.0.50727\CONFIG\machine.config`

您需要将<machineKey>配置元素添加到<system.web>部分。这里有一篇非常好的文章解释了如何做到这一点:

  

How To: Configure MachineKey in ASP.NET 2.0

向下滚动到“Web Farm Deployment Considerations”部分并生成加密随机密钥。

如果您正在运行负载平衡的Web场,则还需要将每台服务器的计算机密钥设置为完全相同的值。

表单action值不正确(3.5SP1):

还有一个案例(3.5SP1之后),如果你将ASP.NET表单的action属性设置为回发的页面之外的其他属性,而你没有使用跨页回发,那么你将得到这个错误。但你马上就会看到这个:

  

Validation of viewstate MAC failed after installing .NET 3.5 SP1

时间/长时间运行页面:

如果页面部分呈现并发生回发,那么页面的边缘情况需要很长时间才能呈现:

  

Validation of viewstate MAC failed error

     

根本原因出现此异常是因为使用DataKeyNames的控件   要求Viewstate加密。   Viewstate加密时(默认值   模式,自动,是加密控件   要求,否则不是,Page   增加   关闭之前的字段    标签。但这个隐藏的领域   可能没有被渲染到   具有长时间运行页面的浏览器   如果你在它之前做回发,   浏览器启动回发而不用   这个字段(在表格后收集)。   最终结果是,如果此字段是   在回发时省略,页面没有   知道Viewstate是加密的   导致上述异常。   I.E.页面期望完全加载   在你回发之前。

答案 1 :(得分:11)

我花了一段时间才找到答案,因为我被告知我正在比较它的另一台IIS7服务器是由同一个人设置的。

事实证明,使用Plesk设置了收到此错误的网站的服务器,而其他服务器没有设置。

似乎Plesk在应用程序池上将Idle-Timeout设置为5分钟,这就是造成此错误的原因。

要更改此操作,请执行以下操作:

  1. 打开IIS
  2. 单击“应用程序池节点”
  3. 找到您的Web应用程序的应用程序池
  4. 右键单击并选择Advanace设置
  5. 将空闲超时(分钟)属性设置为0或将其增加到30+分钟

答案 2 :(得分:2)

我遇到了这个问题,该场景是一个托管非常基本的ASP.Net应用程序的单个Web服务器。在经历了很多努力之后,我找到了这篇文章,这帮助我理解问题是工人流程得到了回收。

我发现这非常苛刻,因为它是应用程序可能面临的情况,并且这样的核心错误会阻止您正确处理它。我可以看到,这是因为处理此密钥的默认配置将使用machine.config来表明每个应用程序自动生成和隔离密钥。我认为在这种情况下,ASP.Net是一个临时密钥,并将其存储在工作进程级别,当该工作进程消失时,问题就出现了,无法处理。

配置机器密钥的替代方案可以解决问题,最好将其设置在web.config文件而不是整个machine.config上,以使其保持在最低粒度级别。

另一种选择是通过web.config禁用视图状态MAC检查。它取决于应用程序的安全级别以及视图状态被篡改的风险。

最好的选择是避免在MVC应用程序中使用视图状态。

答案 3 :(得分:2)

对我来说,这解决了问题:

我已在应用程序池中设置LoadUserProfile = True,以使HKCU注册表配置单元可用于该应用程序。

注意:这与IIS 7.0 +

兼容

答案 4 :(得分:0)

viewstate MAC验证失败。如果此应用程序由Web场或群集托管,请确保配置指定相同的validationKey和验证算法。 AutoGenerate不能在群集中使用 我发现有一个<base ....  标记在我的母版页的标题部分,我在最后一个领带和发布之前添加。此标记为页面上的所有链接指定默认URL和默认目标。这次是造成这个错误的主要原因。