如果您在我们服务器上托管的某个网站上打开网页,请将其保留20分钟,然后提交表单,则会发生Validation of viewstate MAC failed.
错误。
可能有什么理由呢?
答案 0 :(得分:12)
出现这种情况有几个原因:
自动生成的计算机密钥:
如果您的应用程序池具有20分钟的默认空闲超时并且您正在使用自动生成的验证和解密密钥,那么每次池启动时它将生成一组新的密钥。这会使浏览器的加密视图状态无效。您还会发现持久性票证的表单身份验证票证也将变为无效。
要克服此问题,请将这些键设置为固定值:
`c:\%systemroot%\microsoft.net\framework\v2.0.50727\CONFIG\machine.config`
您需要将<machineKey>
配置元素添加到<system.web>
部分。这里有一篇非常好的文章解释了如何做到这一点:
向下滚动到“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分钟,这就是造成此错误的原因。
要更改此操作,请执行以下操作:
答案 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和默认目标。这次是造成这个错误的主要原因。