2011年10月11日 星期二

當 ASP.NET 發生 Viewstate MAC 的驗證失敗 ( machineKey )的解決方式

image
ASP.NET: Validation of viewstate MAC failed

我的asp.net網站放在虛擬主機上,可是三不五時就發生 Validation of viewstate MAC failed 這種錯誤。

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.

當 ASP.NET 因為網頁還沒全部下載完成時,使用者就按下網頁中的任意一個 PostBack 的按鈕或連結時,就會發生「Viewstate MAC 的驗證失敗」的錯誤訊息!

主要原因在於

1. 當網站採用 Web-farm 架構時,也就是一個網站採用負載平衡的架構,用多台 Web 主機同時提供服務時。

因為 ASP.NET 預設會將 Viewstate 編碼加密,驗證資料的加密類型是 SHA1,驗證加密資料的金鑰(Key)預設是「自動產生」,所以每一台Web主機所產生的Key都不一樣,所以你採用多台主機同時提供服務時,就可能會遇到從第一台Web主機讀到的內容,做 PostBack 時可能會 PostBack 到第二台主機,但第二台主機看不懂第一台主機編碼過的 Viewstate,而導致「Viewstate MAC 的驗證失敗」的例外發生。
這時你需要統一每一台主機的 machineKey 才能讓每一台的編碼加密的內容可以被正確驗證

2. 因為網頁還沒全部下載完成,導致頁面的狀態不完整時就對伺服器發出 PostBack 要求,因為 ViewState 不完整,而導致 Viewstate 驗證失敗。

這個問題只能將修改網站的 web.config 設定將 Viewstate 全部關閉才不會發生錯誤!如下

<pages EnableEventValidation="false" EnableViewStateMac="false" ViewStateEncryptionMode="Never"

 

所以DNOWBA的問題應該是第一個原因導致,所以我們在 web.config 的 <system.web> 內加上一個指定的 <machineKey>,有些網站有提供 Generate Machine Key 的服務和參考文件: http://www.betterbuilt.com/machinekey/default.aspx
http://www.codeproject.com/KB/aspnet/machineKey.aspx
ASP.NET machineKey Generator

沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...
// Dnow Function