2011-04-30 127 views
19

我在asp.net网站的某些时间收到以下错误。Asp.net视图状态MAC验证失败

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. 

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

+1

一些更多的信息是需要。这是在你的单一开发者机器上吗?生产服务器?是否有多个生产服务器(即网络农场)? – 2011-04-30 09:49:01

+0

我的开发团队中有同样的错误。有些电脑出现这个错误,有些电脑却没有。任何人都可以提供答案? (这两个贴都不能解决我的问题) – Apolo 2015-04-15 15:16:58

+0

我在MSDN上看到这篇文章(http://blogs.msdn.com/b/webtopics/archive/2009/05/13/viewstate-exception-may-come-with -action-attribute-in-form-tag-post-net-framework-3-5-sp1.aspx),你有代码来重现。提供的解决方案(删除表单的动作属性)并不好(因为我的表单将无处可去) – Apolo 2015-04-15 15:18:30

回答

19

如果您使用的是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

@imanabidi链接似乎已经死亡。 – 2016-04-20 11:44:31

+1

在这里生成一个http://www.developerfusion.com/tools/generatemachinekey – 2016-04-22 09:17:04

+0

@SonerGönül,谢谢。链接是固定的 – 2016-04-22 09:18:26

0

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

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

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

在流程模型下,将标识值设置为网络服务。

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

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

希望这可以帮助你克服这个错误。

+0

虽然这些是有用的配置提示,但告诉TC“您的网站现在应该运行没有任何问题”是误导性的。真正的答案确实存在于machineKey中,正如其他答案中所述。 – DanM7 2012-10-02 16:30:32

+3

将身份从ApplicationPoolIdentity更改为NetworkService可让IIS获得比所需更多的权限。这再次降低了解决问题的安全性。请阅读下面的进一步解释,http://www.iis.net/learn/manage/configuring-security/application-pool-identities – Carlosfocker 2013-02-14 20:24:21

+0

这并没有解决问题 – Esen 2015-02-19 00:49:22

2

在多服务器环境中,当会话过期并且应用程序的另一个实例使用相同的会话ID和计算机密钥,但位于不同服务器上时,可能会发生此错误。起初,每个服务器都会生成自己的机器密钥,后者与应用程序的单个实例相关联。当会话过期并且当前服务器繁忙时,应用程序将通过负载均衡器重定向到更具操作性的服务器。以我为例,我从多台服务器上运行相同的应用程序,错误消息:

Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that configuration specifies the same validationKey and validation algorithm

下在web.config中定义的机器代码有解决的问题。基于微软的解决方案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) 
    } 
} 

然后: ,但使用的第三方网站生成代码可能已损坏,请从您的命令shell中运行这个

对于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="..." />

0

什么工作让我

  1. 搜索 “的machineKey发电机”

  2. 登录网站到网站之一找到并生成机器密钥,看起来像...(数字更大)
    ... MachineKey
    的validationKey = “0EF6C03C11FC ... 63EAE6A00F0B6B35DD4B” decryptionKey = “2F5E2FD80991C629 ... 3ACA674CD3B5F068” 验证= “SHA1” 解密= “AES”/>

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

如果你想跟着我做的路径...


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 - 艾哈迈德Mithat博斯坦斯 - 2012年7月31日 您可以在Bing搜索 “的machineKey发生器”,并使用在线服务。老实说...


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

+1

MS支持链接,你给了强大的阻碍在线MachineKey Generators https://support.microsoft.com/en-us/kb/2915218#AppendixA – 2016-02-25 05:07:34

0

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

答:

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

8

微软说要never use 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,并选择了一个网站,此屏幕:

enter image description here

  1. 双击Machine Key图标以获得此屏幕:

enter image description here

  • 点击 “生成密钥” 上,我在PIC上面概述的右连杆。
  • 注:

    • 如果选择“生成每个应用程序的唯一密钥”复选框 “ IsolateApps”将被添加到您的钥匙结束。我有 删除这些让应用程序工作。显然,他们不是 的关键部分。
    • SHA1是IIS选择的默认加密方法,如果您更改它,请不要忘记更改web.config中machineKey的验证属性。然而,加密方法和算法的演变,请随时编辑 这篇文章与更新的首选加密方法或在笔记中提及它 ,我会更新。
    8

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

    1. 使用以下站点生成计算机密钥:http://www.blackbeltcoder.com/Resources/MachineKey.aspx
    2. 复制完整机器的激活码。
    3. 转到您的Web.Config文件。
    4. 粘贴在下面的代码段的计算机密钥:

      <configuration>

      <system.web>

      <machineKey ... /> 
      

      </system.web>

      </configuration>

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

    +0

    我收到此错误: '在应用程序级别之外使用注册为allowDefinition ='MachineToApplication'的节是错误的。此错误可能是由于虚拟目录没有被配置为IIS中的应用程序。' Idk这意味着什么。 – AskYous 2016-04-19 15:29:15

    +0

    您是否使用asp.net上的Web Form网站? – TsTeaTime 2016-04-19 15:31:14

    +0

    是的。这是一个asp.net上的web表单。 – AskYous 2016-04-19 22:21:01

    7

    我有这个问题,对我来说,答案是不同于这个问题的其他答案。

    我有一个很多客户的应用程序。我在global.asax的application_error中发现了所有错误,并发送了一封包含错误细节的电子邮件。在我发布了我的应用程序的新版本后,我开始接收很多viewstate MAC失败错误消息的验证。

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

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

    0

    我有这个相同的问题,这是由于在启用排序的页面上的Gridview(由vb代码生成)。禁用排序解决了我的问题。我对使用SQLdatasource创建的gridviews没有这个问题。

    0

    我不知道这是怎么发生的,但我开始在我的内部提交表单页面中得到这个错误。所以当我提交的东西,我得到这个错误。但问题是这个网站差不多工作5-6年。我不记得我做了一个重要的改变。

    没有解决方案为我工作。

    我已经安装了与Microsoft脚本计算机密钥并将其复制到我的web.config

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

    aspnet_regiis -ga "IIS APPPOOL\My App Pool" 
    

    也试过这个代码添加到页面:

    enableViewStateMac="false" 
    

    仍然没有运气。

    解决此问题的任何其他想法?

    UPDATE:

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

    <base href="/" /> 
    
    0

    我的问题是,这段JavaScript代码

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

    把它与视图状态隐藏字段搞乱,所以我把它改成下面的代码,它的工作

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