Asp.net对viewstate MAC的验证失败

时间:2011-04-30 09:44:13

标签: asp.net viewstate machinekey

我在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.

当页面刷新时,没问题。我怎样才能解决这个问题?

17 个答案:

答案 0 :(得分:23)

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

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

将其放在<system.web>标记下。

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

答案 1 :(得分:15)

我遇到了这个问题,对我而言,答案与此问题的其他答案不同。

我有很多客户申请。我在global.asax中的application_error中捕获了所有错误,并向我发送了一封包含错误详细信息的电子邮件。在我发布了我的应用程序的新版本后,我开始收到很多关于viewstate MAC失败的验证错误消息。

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

我很抱歉我的英语,我知道我的情况非常具体,但是如果它可以帮助别人节省一天,我认为这是一件好事。

答案 2 :(得分:14)

微软对never use a key generator web site说。

和其他人一样,我将此添加到我的web.config。

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

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

  1. 打开IIS并选择一个网站以获取此屏幕:
  2. enter image description here

    1. 双击“机器密钥”图标以显示此屏幕:​​
    2. enter image description here

      1. 点击我在上图中列出的右侧的“生成密钥”链接。
      2. 注意:

        • 如果选择“为每个应用程序生成唯一键” 复选框,“,IsolateApps”将添加到您的键的末尾。我有 删除这些以使应用程序工作。显然,他们不是一部分 关键。
        • SHA1是IIS选择的默认加密方法,如果您更改它,请不要忘记在web.config中更改machineKey上的验证属性。但是,加密方法和算法也在不断发展,请随时编辑 这篇文章有更新的首选加密方法或提及它 在笔记中,我会更新。

答案 3 :(得分:8)

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

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

    <configuration&GT;

    <system.web&GT;

    <machineKey ... />
    

    </system.web&GT;

    </configuration&GT;

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

答案 4 :(得分:2)

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

  

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

在web.config下定义机器代码已解决问题。 但是,不要使用第三方网站来生成可能已损坏的代码,请从命令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="..." />

答案 5 :(得分:1)

我的问题是这段javascript代码

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

发现它弄乱了viewstate隐藏字段,所以我将其更改为代码下方并且有效

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

答案 6 :(得分:0)

我遇到了同样的问题,这是由于页面上的Gridview(从vb代码生成)启用了排序。禁用排序修复了我的问题。我对使用SQLdatasource创建的gridviews没有这个问题。

答案 7 :(得分:0)

这对我有用

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

答案 8 :(得分:0)

我在我们的项目中遇到了同样的问题。 Microsoft support web page可以帮助我找到原因。 this solution有助于解决问题。

在我的情况下,问题出在ViewStateUserKey周围,因为Page.ViewStateUserKey属性的值不正确(Caused 4 in here)。如here中所述,删除本地证书并通过修复IIS Expres来重新创建本地证书,即可解决此问题。

答案 9 :(得分:0)

我在IIS托管的网站上也遇到过类似的问题。此问题通常是由于IIS应用程序池设置引起的。由于一段时间后应用程序池回收,这对我造成了问题。

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

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

enter image description here

然后重试。它将解决您的问题。

答案 10 :(得分:0)

/**
   * Randomly splits this Dataset with the provided weights.
   *
   * @param weights weights for splits, will be normalized if they don't sum to 1.
   * @group typedrel
   * @since 2.0.0
   */
  def randomSplit(weights: Array[Double]): Array[Dataset[T]] = {
    randomSplit(weights, Utils.random.nextLong)
  }

答案 11 :(得分:0)

亲爱的所有人,所有答复都在那里回答 有案例给出了这个错误 当web.config值为

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

并且链接是http而不是https

答案 12 :(得分:0)

我的客户正在发生另一种情况。由于班次变化和需要用其他用户登录的用户,这种情况通常在一定时间内发生。 在这种情况下,防伪系统会通过生成此错误来保护系统:

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

答案 13 :(得分: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="/" />

答案 14 :(得分:0)

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

答案:

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

答案 15 :(得分:0)

为我工作的是什么

  1. 在网上搜索&#34; MachineKey generator&#34;

  2. 转到找到的其中一个站点并生成机​​器密钥,它看起来像......(数字更大)
    ...的machineKey
    的validationKey =&#34; 0EF6C03C11FC ... 63EAE6A00F0B6B35DD4B&#34; decryptionKey =&#34; 2F5E2FD80991C629 ... 3ACA674CD3B5F068&#34; 验证=&#34; SHA1&#34;解密=&#34; AES&#34; /&GT;

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

  4. 如果你想按照我做的路径......

    https://support.microsoft.com/en-us/kb/2915218#AppendixA
    解决视图状态消息验证代码(MAC)错误 第3b号决议:使用明确的<machineKey>
    通过向应用程序的Web.config文件添加显式<machineKey>元素,开发人员告诉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中搜索&#34; MachineKey generator&#34;并使用在线服务。诚实...

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

答案 16 :(得分:0)

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

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

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

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

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

您的网站现在应该没有任何问题。

希望这有助于您克服此错误。