48

我在 asp.net 网站上的某些时候收到以下错误。

 Sys.WebForms.PageRequestManagerServerErrorException: 
 Validation of viewstate MAC failed. 
 If this application is hosted by a Web Farm or cluster,
 ensure that <machineKey> configuration specifies the 
 same validationKey and validation algorithm. 
 AutoGenerate cannot be used in a cluster.

当页面刷新时,没问题。我该如何解决这个问题?

4

17 回答 17

30

如果您使用网络场并在多台计算机上运行相同的应用程序,则需要在 machine.config 文件中明确定义机器密钥:

<machineKey validationKey="JFDSGOIEURTJKTREKOIRUWTKLRJTKUROIUFLKSIOSUGOIFDS..." decryptionKey="KAJDFOIAUOILKER534095U43098435H43OI5098479854" validation="SHA1" />

把它放在<system.web>标签下面。

无法使用机器代码的 AutoGenerate。要生成您自己的 machineKey,请参阅此 powershell 脚本: https: //support.microsoft.com/en-us/kb/2915218#bookmark-appendixa

于 2011-04-30T09:51:26.410 回答
26

微软说永远不要使用密钥生成器网站

像这里的其他人一样,我将此添加到我的web.config.

<System.Web>
    <machineKey decryptionKey="ABC123...SUPERLONGKEY...5432JFEI242" 
                validationKey="XYZ234...SUPERLONGVALIDATIONKEY...FDA" 
                validation="SHA1" />
</system.web>

但是,我使用 IIS 作为我的 machineKey 生成器,如下所示:

  1. 打开 IIS 并选择一个网站以获取此屏幕:

在此处输入图像描述

  1. 双击机器密钥图标以获取此屏幕:

在此处输入图像描述

  1. 单击我在上图中概述的右侧的“生成密钥”链接。

笔记:

  • 如果您选中“为每个应用程序生成唯一密钥”复选框,“,IsolateApps”将添加到您的密钥末尾。我必须删除这些才能使应用程序正常工作。显然,它们不是关键的一部分。
  • SHA1 是 IIS 选择的默认加密方法,如果您更改它,请不要忘记更改 web.config 中 machineKey 的验证属性。但是,加密方法和算法会不断发展,因此请随时使用更新的首选加密方法编辑这篇文章,或者在注释中提及它,我会更新。
于 2016-02-25T05:36:45.070 回答
24

我遇到了这个问题,对我来说,答案与这个问题的其他答案不同。

我有一个有很多客户的应用程序。我在 application_error 中捕获了所有错误,global.asax并向自己发送了一封包含错误详细信息的电子邮件。在我发布了我的应用程序的新版本后,我开始收到很多 Validation of viewstate MAC failed 错误消息。

经过一天的搜索,我意识到我的应用程序中有一个计时器,它每分钟刷新一个更新面板。因此,当我发布了我的应用程序的新版本时,一些客户在我的网站上打开了她的电脑。每次计时器刷新时我都会收到一条错误消息,因为实际的视图状态与新的不匹配。在所有客户关闭网站或刷新浏览器以获取新版本之前,我都会收到此消息。

对不起我的英语,我知道我的情况很具体,但如果它可以帮助某人节省一天,我认为这是一件好事。

于 2016-04-15T00:33:57.067 回答
9

该解决方案使用 Web 窗体站点在 ASP.NET 4.5 中为我工作。

  1. 使用以下站点生成机器密钥: http: //www.blackbeltcoder.com/Resources/MachineKey.aspx
  2. 复制完整的机器密钥代码。
  3. 转到您的 Web.Config 文件。
  4. 将机器密钥粘贴到以下代码部分:
    <configuration>
      <system.web>
        <machineKey ... />
      </system.web>
    </configuration> 

您不应再看到 viewstate Mac failed 错误。同一个应用程序池中的每个网站都应该有一个单独的机器密钥,否则此错误将继续存在。

于 2016-03-01T09:39:57.520 回答
6

亲爱的所有人,尽管 web.config 值为

<httpCookies httpOnlyCookies="true" requireSSL="true"/>

并且链接是 http 不是 https

于 2019-04-01T10:17:29.220 回答
4

在多服务器环境中,当会话过期并且应用程序的另一个实例使用相同的会话 ID 和机器密钥但在不同的服务器上时,可能会发生此错误。起初,每台服务器都产生自己的机器密钥,该密钥随后与应用程序的单个实例相关联。当会话到期并且当前服务器很忙时,应用程序会被重定向,就像通过负载均衡器一样,重定向到更可操作的服务器。在我的情况下,我从多个服务器运行相同的应用程序,错误消息:

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

在web.config下定义机器码就可以解决问题了。但不要使用可能已损坏的代码生成 3rd 方站点,请从您的命令 shell 运行:基于 microsoft 解决方案 1a,https://support.microsoft.com/en-us/kb/2915218#AppendixA

# Generates a <machineKey> element that can be copied + pasted into a Web.config file.
function Generate-MachineKey {
  [CmdletBinding()]
  param (
    [ValidateSet("AES", "DES", "3DES")]
    [string]$decryptionAlgorithm = 'AES',
    [ValidateSet("MD5", "SHA1", "HMACSHA256", "HMACSHA384", "HMACSHA512")]
    [string]$validationAlgorithm = 'HMACSHA256'
  )
  process {
    function BinaryToHex {
        [CmdLetBinding()]
        param($bytes)
        process {
            $builder = new-object System.Text.StringBuilder
            foreach ($b in $bytes) {
              $builder = $builder.AppendFormat([System.Globalization.CultureInfo]::InvariantCulture, "{0:X2}", $b)
            }
            $builder
        }
    }
    switch ($decryptionAlgorithm) {
      "AES" { $decryptionObject = new-object System.Security.Cryptography.AesCryptoServiceProvider }
      "DES" { $decryptionObject = new-object System.Security.Cryptography.DESCryptoServiceProvider }
      "3DES" { $decryptionObject = new-object System.Security.Cryptography.TripleDESCryptoServiceProvider }
    }
    $decryptionObject.GenerateKey()
    $decryptionKey = BinaryToHex($decryptionObject.Key)
    $decryptionObject.Dispose()
    switch ($validationAlgorithm) {
      "MD5" { $validationObject = new-object System.Security.Cryptography.HMACMD5 }
      "SHA1" { $validationObject = new-object System.Security.Cryptography.HMACSHA1 }
      "HMACSHA256" { $validationObject = new-object System.Security.Cryptography.HMACSHA256 }
      "HMACSHA385" { $validationObject = new-object System.Security.Cryptography.HMACSHA384 }
      "HMACSHA512" { $validationObject = new-object System.Security.Cryptography.HMACSHA512 }
    }
    $validationKey = BinaryToHex($validationObject.Key)
    $validationObject.Dispose()
    [string]::Format([System.Globalization.CultureInfo]::InvariantCulture,
      "<machineKey decryption=`"{0}`" decryptionKey=`"{1}`" validation=`"{2}`" validationKey=`"{3}`" />",
      $decryptionAlgorithm.ToUpperInvariant(), $decryptionKey,
      $validationAlgorithm.ToUpperInvariant(), $validationKey)
  }
}

然后:

对于 ASP.NET 4.0

Generate-MachineKey

您的密钥将如下所示:<machineKey decryption="AES" decryptionKey="..." validation="HMACSHA256" validationKey="..." />

对于 ASP.NET 2.0 和 3.5

Generate-MachineKey -validation sha1

您的密钥将如下所示:<machineKey decryption="AES" decryptionKey="..." validation="SHA1" validationKey="..." />

于 2015-06-05T10:04:58.827 回答
3

我的问题是这段 javascript 代码

$('input').each(function(ele, indx){
    this.value = this.value.toUpperCase();
});

原来它弄乱了视图状态隐藏字段,所以我将其更改为下面的代码并且它有效

$('input:visible').each(function(ele, indx){
    this.value = this.value.toUpperCase();
});
于 2017-10-27T10:44:56.773 回答
1

什么对我有用

  1. 在网上搜索“MachineKey 生成器”

  2. 转到找到的站点之一并生成机器密钥,看起来像...(数字更大)
    ...MachineKey
    validationKey="0EF6C03C11FC...63EAE6A00F0B6B35DD4B" decryptionKey="2F5E2FD80991C629...3ACA674CD3B5F068" validation= "SHA1" 解密="AES" />

  3. 复制并粘贴到<system.web>web.config 文件中的部分。

如果你想走我走过的路...


https://support.microsoft.com/en-us/kb/2915218#AppendixA
解决视图状态消息身份验证代码 (MAC) 错误 解决方案 3b:使用显式<machineKey>
通过将显式<machineKey>元素添加到应用程序的 Web.config 文件,开发人员告诉 ASP.NET 不要使用自动生成的加密密钥。有关如何生成<machineKey>元素的说明,请参见附录 A。


http://blogs.msdn.com/b/amb/archive/2012/07/31/easiest-way-to-generate-machinekey.aspx
生成 MachineKey 的最简单方法 - Ahmet Mithat Bostanci - 2012 年 7 月 31 日 您可以在Bing for "MachineKey generator" 并使用在线服务。诚实地...


http://www.blackbeltcoder.com/Resources/MachineKey.aspx

于 2016-01-12T02:53:04.747 回答
0

在您将网站发布到服务器后,通常会显示此错误消息。

主要问题在于您用于网站的应用程序池。

在与您的网站相关的应用程序池的常规部分下,配置您的网站以使用正确的 .NET Framework 版本(即 v4.0)。

在 Process Model 下,将 Identity 值设置为 Network Service。

关闭对话框并右键单击您的网站,然后从内容菜单的管理网站选项中选择高级设置...。在对话框中的常规部分下,确保您选择了要使用的应用程序池的正确名称。

您的网站现在应该可以正常运行了。

希望这可以帮助您克服此错误。

于 2012-09-07T20:50:30.430 回答
0

我在我们的项目中遇到了同样的问题。这个Microsoft 支持网页帮助我找到了原因。这个解决方案有助于解决这个问题。

在我的情况下,问题在于ViewStateUserKey属性Page.ViewStateUserKey的值不正确(此处为 Caused 4)。删除 localhost 证书并通过修复 IIS Express 重新创建它们,如此所述解决了该问题。

于 2020-01-13T04:14:01.437 回答
0

我不确定这是怎么发生的,但我开始在我的内部提交表单页面中收到此错误。因此,当我提交某些内容时,我会收到此错误。但问题是这个网站几乎可以运行 5-6 年。我不记得我做了什么重要的改变。

没有一个解决方案对我有用。

我已经使用 Microsoft 脚本设置了机器密钥并复制到我的 web.config

我已经执行了 asp.net regiis 脚本。

aspnet_regiis -ga "IIS APPPOOL\My App Pool"

还尝试将此代码添加到页面中:

enableViewStateMac="false"

仍然没有运气。

还有其他想法可以解决这个问题吗?

更新:

最后我解决了这个问题。我已将我的 angular 4 组件集成到我的 asp.net 网站中。所以我在我的母版页中添加了基本 href。所以我删除了该代码,它现在工作正常。

<base href="/" />
于 2017-07-19T16:01:06.493 回答
0

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

回答 :

<machineKey  decryptionKey="2CC8E5C3B1812451A707FBAAAEAC9052E05AE1B858993660" validation="HMACSHA256" decryption="AES" validationKey="CB8860CE588A62A2CF9B0B2F48D2C8C31A6A40F0517268CEBCA431A3177B08FC53D818B82DEDCF015A71A0C4B817EA8FDCA2B3BDD091D89F2EDDFB3C06C0CB32" />

于 2016-02-20T05:19:56.157 回答
0

我在 IIS 上托管的网站上遇到了类似的问题。这个问题一般是因为 IIS 应用程序池设置。由于应用程序池在一段时间后回收,这对我来说是个问题。

以下步骤可帮助我解决此问题:

  1. 在 IIS 上打开您网站的应用程序池。
  2. 转到右侧窗格上的高级设置。
  3. 向下滚动到流程模型
  4. 将空闲超时分钟更改为 20 或您不想回收应用程序池的分钟数。

在此处输入图像描述

然后再试一次。它将解决您的问题。

于 2019-11-28T07:49:02.277 回答
0

那对我有用

只需添加它:在 system.web 部分 <system.web> 之间

</system.web>

于 2021-06-11T13:25:32.850 回答
0
<system.web>
<pages validateRequest="false" enableEventValidation="false" viewStateEncryptionMode ="Never" />
</system.web>
于 2019-08-16T03:12:41.157 回答
0

还有另一种情况发生在我的客户身上。由于班次变化和用户需要使用不同的用户登录,这种情况通常会在特定时间发生。这是防伪系统通过生成此错误来保护系统的场景:

1-一旦关闭/打开您的浏览器。2- 转到您的网站并使用“用户 A”登录 3- 在浏览器中打开新标签并输入相同的地址站点。(您可以在没有任何身份验证的情况下查看您的站点主页) 4- 从您的站点注销并在第二个选项卡中与另一个用户(用户 B)登录。5- 现在返回到您由“用户 A”登录的第一个选项卡。您仍然可以看到该页面,但此选项卡中的任何操作都会导致错误。因为您的 cookie 已由“用户 B”更新,而您正试图发送无效用户的请求。(用户 A)

于 2018-09-04T07:41:27.327 回答
0

我遇到了同样的问题,这是由于页面上启用了排序的 Gridview(从 vb 代码生成)。禁用排序解决了我的问题。使用 SQL 数据源创建的网格视图没有这个问题。

于 2016-04-28T13:30:42.093 回答