2011-04-30 105 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(); 
    }); 
    
    相關問題