我在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.
当页面刷新时,没问题。我怎样才能解决这个问题?
答案 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生成器,如下所示:
答案 3 :(得分:8)
此解决方案在ASP.NET 4.5中使用Web窗体站点工作。
将机器密钥粘贴到以下代码部分:
<configuration
&GT;
<system.web
&GT;
<machineKey ... />
</system.web
&GT;
</configuration
&GT;
您不应再看到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)
}
}
然后:
Generate-MachineKey
您的密钥将如下所示:<machineKey decryption="AES" decryptionKey="..." validation="HMACSHA256" validationKey="..." />
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应用程序池设置引起的。由于一段时间后应用程序池回收,这对我造成了问题。
以下步骤可帮助我解决该问题:
然后重试。它将解决您的问题。
答案 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)
为我工作的是什么
在网上搜索&#34; MachineKey generator&#34;
转到找到的其中一个站点并生成机器密钥,它看起来像......(数字更大)
...的machineKey
的validationKey =&#34; 0EF6C03C11FC ... 63EAE6A00F0B6B35DD4B&#34; decryptionKey =&#34; 2F5E2FD80991C629 ... 3ACA674CD3B5F068&#34;
验证=&#34; SHA1&#34;解密=&#34; AES&#34; /&GT;
复制并粘贴到web.config文件的<system.web>
部分。
如果你想按照我做的路径......
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;并使用在线服务。诚实...
答案 16 :(得分:0)
将您的网站发布到服务器后,通常会显示此错误消息。
主要问题在于您用于网站的应用程序池。
将您的网站配置为使用与您的网站相关的应用程序池的“常规”部分下的正确.NET Framework版本(即v4.0)。
在Process Model下,将Identity值设置为Network Service。
关闭对话框并右键单击您的网站,然后从内容菜单的“管理网站”选项中选择“高级设置...”。在对话框的“常规”部分下,确保选择了要使用的应用程序池的正确名称。
您的网站现在应该没有任何问题。
希望这有助于您克服此错误。