1. 程式人生 > >Validation of viewstate MAC failed 解決辦法

Validation of viewstate MAC failed 解決辦法

大部分人都說是在頁裡或web.config里加EnableEventValidation="false" EnableViewStateMac="false" ViewStateEncryptionMode="Never" 這些屬性的設定。但是這並不從根本上解決問題,相反這樣做了反而更加不安全。

為了解決問題我繼續收集資料,不經意的發現了一個網頁裡講到一個Blog系統從NET1.1升級到NET2後,之前所生成的所有cookies將會失效,因為NET2和NET1使用的machineKey不一樣。哈哈,真是恍然大悟啊!

 WEB應用中經常遇到採用叢集或負載均衡交換機等方式實現多伺服器共同對外提供服務,分擔壓力。在這樣的環境下,如果Asp.Net程式執行時碰到如下中文錯誤:

“驗證檢視狀態 MAC 失敗。如果此應用程式由網路場或群集承載,請確保 <machineKey> 配置指定了相同的validationKey 和驗證演算法。不能在群集中使用 AutoGenerate。”

或如下英文錯誤:

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.

則說明多臺WEB伺服器上的WEB應用程式沒有使用統一的machineKey導致的。


       那麼machineKey的作用是什麼呢?

按照MSDN的標準說法:“對金鑰進行配置,以便將其用於對 Forms 身份驗證 Cookie 資料和檢視狀態資料進行加密和解密,並將其用於對程序外會話狀態標識進行驗證。”

也就是說Asp.Net的很多加密,都是依賴於machineKey的設定,例如Forms 身份驗證 Cookie、ViewState的加密。預設情況下,Asp.Net的配置是自己動態生成,validationKey和decryptionKey的預設值是AutoGenerate。如果單臺伺服器當然沒問題,但是如果多臺伺服器負載均衡,machineKey還採用動態生成的方式,每臺伺服器上的machinekey值不一致,就導致加密出來的結果也不一致,不能共享驗證和ViewState,所以對於多臺伺服器負載均衡的情況,一定要在每臺站點配置相同的machineKey。

至此真相水落石出,立刻在web.config中新增關於machineKey的配置項,並手動設定其中的金鑰值,這裡請注意,不同加密演算法對於金鑰的最大字元長度是不同的,在這裡能夠使用的有AES,DES,3DES,SHA1,MD5,我只知道DES的金鑰字元長度為16,3DES長度為48,手動設定時金鑰長度必須等於其最大長度,否則會出錯!至於金鑰的16進位制值可以隨便輸入。

參考的web.config 中matchineKey配置:

<system.web>
              <machineKey validation="3DES" validationKey="319B474B1D2B7A87C996B280450BB36506A95AEDF9B51211"

         decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A87" decryption="3DES"/>
      </system.web>

       好了,問題得已解決!希望廣大朋友遇到MAC驗證檢視狀態失敗的問題的時候,不要馬上把EnableViewStateMac="false"設定成這樣就完事了。先分析什麼原因導致了這個錯誤的發生,禁用掉EnableViewStateMac驗證是可以解決問題,但這不是根本的,起碼是犧牲了一定的安全性!

原文:http://blog.csdn.net/liu_zhongjie/article/details/5290365 

注意:實際使用時報錯

此時按照提示將validation換成SHA1就OK了