The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

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

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

這問題實在很難除錯(DEBUG),我想很多人連發生的原因都不知道,主要的發生原因有兩種:

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

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

這時你需要統一每一台主機的 machineKey 才能讓每一台的編碼加密的內容可以被正確驗證!建議您去 The Code Project 網站看這份文件:ASP.NET machineKey Generator 上面有完整說明!

底下是我剛寫好的 machineKey 產生器(可以用喔!):

ASP.NET machineKey 產生器
1. 選擇版本:
2. 產生設定:

另外,頁面如果常發生 ViewState 的編碼/解碼會出錯,也會產生許多不必要的 Exceptions 進而造成 Web 主機的負擔。

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

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

<pages enableEventValidation="false" viewStateEncryptionMode ="Never" /> 

參考資料:

machineKey 項目 (ASP.NET 設定結構描述)
http://msdn2.microsoft.com/zh-tw/library/w8h3skw9(VS.80).aspx

ASP.NET machineKey Generator
http://www.codeproject.com/aspnet/machineKey.asp
http://www.developmentnow.com/articles/machinekey_generator.aspx

Invalid_Viewstate or "Unable to validate data" error
http://www.developmentnow.com/blog/InvalidViewstate+Or+Unable+To+Validate+Data+Error.aspx

Using passwordFormat with ASP.NET Membership
http://www.developmentnow.com/blog/Using+PasswordFormat+With+ASPNET+Membership.aspx

ASP.NET 2.0 and "Validation of ViewState Mac failed" exception
http://aspadvice.com/blogs/joteke/archive/2006/02/02/15011.aspx

Visual Studio and .NET Framework 意見因應措施
http://connect.microsoft.com/VisualStudio/feedback/Workaround.aspx?FeedbackID=101988

在 ASP.NET ViewState 中尋寶
http://www.microsoft.com/taiwan/msdn/library/2002/Jan-2002/article/Asp11222001.htm

Control.ViewState Property
http://msdn2.microsoft.com/en-us/library/system.web.ui.control.viewstate(vs.71).aspx

Validation of viewstate MAC failed 驗證ViewState時 MAC 失敗
http://blog.xuite.net/jameswu/net/12310263

Validation of viewstate MAC failed / The state information is invalid for this page and might be corrupted
http://forums.asp.net/p/955145/1173230.aspx#1173230