Asp.net

在頁面上停留 20 分鐘以上時,視圖狀態 MAC 的驗證失敗

  • July 2, 2018

如果您在我們伺服器上託管的某個網站上打開網頁,將其放置 20 分鐘,然後送出表單,Validation of viewstate MAC failed.則會出現錯誤。

這可能有什麼原因?

我們花了一段時間才找到這個問題的答案,因為我被告知另一個 IIS7 伺服器與我進行比較是由同一個人以相同的方式設置的。

事實證明,收到此錯誤的網站的伺服器是使用 Plesk 設置的,而另一台伺服器則沒有。

似乎 Plesk 在應用程序池上將 Idle-Timeout 設置為 5 分鐘,這就是導致此錯誤的原因。

要更改此設置,請執行以下操作:

  1. 打開 IIS
  2. 點擊應用程序池節點
  3. 找到您的 Web 應用程序的應用程序池
  4. 右鍵點擊並選擇高級設置
  5. 將空閒超時(分鐘)屬性設置為 0 或將其增加到 30 分鐘以上

發生這種情況有幾個原因:

自動生成的機器密鑰:

如果您的應用程序池的預設空閒超時時間為 20 分鐘,並且您使用的是自動生成的驗證和解密密鑰,那麼每次池啟動時都會生成一組新的密鑰。這會使瀏覽器的加密視圖狀態無效。您還會發現持久票證的表單身份驗證票證也將失效。

為了克服這個問題,將這些鍵設置為固定值:

`c:\%systemroot%\microsoft.net\framework\v2.0.50727\CONFIG\machine.config`

您需要將<machineKey>配置元素添加到該<system.web>部分。這裡有一篇很好的文章解釋瞭如何做到這一點:

如何:在 ASP.NET 2.0 中配置 MachineKey

向下滾動到“ Web Farm Deployment Considerations ”部分並生成加密隨機密鑰。

如果您正在執行負載平衡的網路場,您還需要將每個伺服器的機器密鑰設置為完全相同的值。

不正確的表單action值 (3.5SP1):

還有一種情況(3.5SP1 後),如果您將actionASP.NET 表單的屬性設置為要回發到的頁面以外的內容,並且您沒有使用跨頁回發,那麼您將收到此錯誤。但是您會立即看到:

安裝 .NET 3.5 SP1 後視圖狀態 MAC 驗證失敗

定時/長時間執行的頁面:

對於需要很長時間才能呈現的頁面,如果頁面被部分呈現並且發生回發,還有一個極端情況:

驗證視圖狀態 MAC 失敗錯誤

根本原因出現此異常是因為使用 DataKeyNames 的控制項要求對 Viewstate 進行加密。當 Viewstate 被加密時(預設模式,Auto,如果控制項需要加密,否則不需要加密),Page 在標籤關閉之前添加欄位。但是這個隱藏欄位可能沒有被呈現給瀏覽器長時間執行的頁面,如果你在它之前進行回發,瀏覽器會在沒有這個欄位的情況下啟動回發(在表單發布集合中)。最終結果是,如果在回發時省略該欄位,則頁面不知道 Viewstate 已加密並導致上述異常。IE 頁面預計在您進行回發之前已完全載入。

引用自:https://stackoverflow.com/questions/4693369