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

問題是這樣的,當 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

 

  

此文章由 will 發表於 2007/11/7 下午 12:28:00

永久連結 | 評論 (10) | 此文章的RSSRSS comment feed |

分類: ASP.NET | Tips

標籤: , , ,

收藏:

相關文章

評論

八月 20. 2008 14:41

.net

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

請問一下,真的只能enableEventValidation="false" 才有解嗎??
enableEventValidation="false" 不是很危險??

.net

八月 20. 2008 19:04

will

看狀況, Web 不只是 ViewState 危險而已,還有許多更危險的東西,例如說:Cookie, POST, HTTP Header, QueryString 都是危險的東西,所有可以從 Client 送到 Server 的資料都有可能包含惡意的程式。

我會將 enableEventValidation 關掉是因為客戶抱怨說他「常常看到 Exception 訊息」,但 ASP.NET 的 ViewState 就是這樣,這是「缺點」的部分,關掉也是不得以的。

will tw

十月 28. 2008 08:10

Swhsu

您好:
請問我目前依照您的方式修改之後,從您這邊產生的MachineKey貼至Web.config後,
並上傳至虛擬主機來測試,但仍然會出現這樣的錯誤,
不知道是我哪邊弄錯了呢?是要由程式中每次執行自動產生呢?
還是得在虛擬主機的電腦上產生MachineKey才對呢?
另外,維護虛擬主機的公司已說明目前他們沒有所謂的伺服器陣列或叢集,
因此這部份很難DEBUG,不知道有哪些方法可以修正呢?謝謝您的幫忙!

Swhsu tw

十月 28. 2008 19:50

will

如果你沒有用 WebFarm 的話,問題根本不在 machineKey 上面,往你寫的程式中找錯誤吧!

will tw

三月 27. 2009 14:37

Eric

您好!小弟最近也是碰到這個問題..
小弟在web.config裡加入此段
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</controls>
</pages>
可是還是會出現此問題..
小弟的網站是放置在虛擬主機裡頭..那請問一下 還有什麼方法可解決嗎??
小弟也通知主機商!!那主機也提供您的部洛格給小弟參考!!希望您能在提供其他解決方式!!麻煩你了!!謝謝

Eric tw

三月 27. 2009 18:26

will

我不清楚你的問題所在,建議可以到『MSDN 論壇』的『ASP.NET 與 AJAX(ASP.NET and AJAX)』討論區發問,網址如下:
social.msdn.microsoft.com/.../

建議你把相關的資訊寫清楚一點,這樣比較有人可以替你解答問題。

will tw

四月 13. 2009 16:44

linda

是不是只把下面的入在web.config中就可以了
<machineKey
validationKey="1870B9CC9F538558DD8D67610337EF19B29638F8259FCE38DE5B8B37F0EB5710B237D63CC4795CD1341F27D9F6A690053E713E9318E854CCF4BFA35F28D95C82"
decryptionKey="BE7AC908DE5C81D50F28CB8A92FDB3CE53F8DE3067957325F9B4EA450ACE3857"
validation="SHA1"
decryption="AES"/>

linda cn

四月 13. 2009 16:45

linda

<system.web>
<machineKey
validationKey="1870B9CC9F538558DD8D67610337EF19B29638F8259FCE38DE5B8B37F0EB5710B237D63CC4795CD1341F27D9F6A690053E713E9318E854CCF4BFA35F28D95C82"
decryptionKey="BE7AC908DE5C81D50F28CB8A92FDB3CE53F8DE3067957325F9B4EA450ACE3857"
validation="SHA1"
decryption="AES"/>

是这样吗?还是有问题呢

linda cn

四月 17. 2009 17:08

digitalwow

複製設定後要如何用在程式中..
還是要修改machine.config .但是租的空間..好像沒辨法...
有進一步說明嗎?

digitalwow

四月 17. 2009 18:54

will

不需要修改 machine.config 喔!
複製設定後程式不用做出任何修正。

will tw

新增評論


(將顯示您的Gravatar圖示)  

  Country flag

[b][/b] - [i][/i] - [u][/u]- [quote][/quote]



線上預覽

二月 9. 2010 20:13