2011-09-08 78 views
13

我面臨的可怕:「視圖狀態MAC驗證失敗如果此應用程序由Web託管遠......」

視圖狀態MAC的

驗證失敗。如果此應用程序由Web Farm或羣集託管,請確保配置指定相同的驗證密鑰和驗證算法。 AutoGenerate不能在羣集中使用。

錯誤。

好吧,我查找它,發現它可能是由兩件事引起的,viewState無法通過頁面驗證,和/或無法驗證的事件。

我把

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

在我的web.config停止的問題,但似乎很難像一個補丁給我。

事情是,我從來沒有在我的應用程序中使用viewState。我知道asp.net默認使用viewstate來存儲一些東西,但我懷疑這裏存儲的默認值會導致任何錯誤。

我注意到問題似乎發生在我postBack和頁面尚未完成加載。

感謝

編輯:請,有人可以測試我的網站www.vittoriosaStarsNursery.com,看看你會得到我上面得到了錯誤?我沒有得到它在當地,但人們不斷告訴我他們得到它。

回答

11

心不是這只是把一個襯在你的web.config

<machineKey decryptionKey="A4B12CCDD50E95F8GB9GFH6JKAT4Y0U0I2OF2DF2AAFE5AB46189C,IsolateApps" validation="AES" validationKey="480CDF2AS9S9AS5CFDGF0GHFH9JJH4KHKAKLJ2L9F3SAS82A6C16911A29EF48903783F94529C21570AACB72766FB38CD4CE7B85B0ACE3149DC5FC1CCF1AA1CECE3579659996593B06,IsolateApps"/> 
+0

那是什麼?它是否與IIS有關?我在我的研究中發現這個問題 – TheGateKeeper

+0

,這是IIS用來加密和解密視圖狀態的加密代碼和方法。如果你沒有它們,那麼當一個新的會話啓動時,它會生成它們並將它們存儲在RAM中,而農場中的其他服務器無法讀取,因此不知道代碼來解密視圖狀態 – Christian

+2

應該注意,你應該保留這些代碼是私密和機密的,因爲與他們一個黑客可能會編輯你的視圖狀態並弄糟你的後端...因此,爲什麼只是複製和粘貼我粘貼的行不會工作:)你可以通過進入IIS自己生成它們,點擊你的網站並點擊生成密鑰(IIS7) – Christian

1

你不會喜歡我的答案。這個錯誤在webforms中基本上是不可避免的。我的解決方案是留下MVC3和剃鬚刀的webforms。

I noticed that the problem seems to happen when i postBack and the page has not finished loading yet.

這是導致此錯誤的最簡單方法之一。在ASP.NET 3.5(或4.0)中,有一個設置可以確保viewstate在頁面的早期被加載,以嘗試幫助減少它。它仍然不能解決它。

將viewstate分塊並不能解決問題。

Webform的工作方式本身就存在一些錯誤,這種錯誤會隨時隨地擾亂您的應用程序。

+0

所以它失去了我的錯誤?當然...我也喜歡asp.net :( – TheGateKeeper

+0

我也一直這樣做,但是MVC3 +剃鬚刀是至少比4-5倍更好的IMO。我的MVC應用程序可以在沒有向錯誤日誌中添加消息的情況下工作幾天。有史以來的應用程序就像12小時 –

+1

我的公司製作了SaaS asp。net web forms應用程序,當我們在我們的日誌中獲取errpos時,它們幾乎總是由我們的代碼中的錯誤引起的。我們很少看到這個錯誤。 –

-1

井的情況下,是的,我想禁用加密的ViewState的解決了這個問題,但我從來沒有測試過我也不勸了。 Viewstate存儲控件的狀態,對於存儲持久變量也非常方便。

例如,你爲一個車庫工作,並有一份工作清單。您轉到列出作業的頁面。現在,您單擊一個作業,該作業將轉到另一個頁面,追加jobid(例如job.aspx?id = 1)。在該頁面上,有一個複選框將該作業標記爲完整。一旦您勾選該複選框,它會將數據發回到同一頁面,並向數據庫寫入作業已完成。但是,服務器如何知道標記爲完成哪項工作,因爲您只從複選框回傳true或false。但是,如果您第一次加載作業詳細信息頁面,則在Viewstate中記錄作業ID,然後在發佈複選框時,可以從視圖狀態讀取jobid。

爲什麼不好用未加密的視圖狀態?

想象一下,服務器必須做標記的工作爲完成。它可能需要運行一個sql命令來更新數據庫。像更新作業SET完成= GETDATE()WHERE id = 1。

如果你的瀏覽狀態wasnt加密的,我可以添加自己的作業id,我會把類似「;刪除作業;'那麼這將抵消初始UPDATE命令,並刪除所有你的工作......爲車庫:)

+0

你爲什麼使用ASPX頁面?這聽起來像你可能會更好使用PHP或甚至shtml :)頁面。 – Christian

+0

視圖狀態加密不會像那樣工作(並且在這裏引用一本書),加密意味着你不能讀取值,即使它的禁用,asp.net檢查值是否仍然有效。它通過在每個值的末尾添加一個代碼來完成此操作,然後在回發中對其進行比較。用戶仍然可以讀取該值,但是如果他更改並回發,並且不能工作。 – TheGateKeeper

+0

好的。像校驗和一樣。有一種方法可以設置視圖狀態以將自己保存到數據庫中,這可能會幫助您解決問題,但目前我正在度假,因此無法在下個星期之前複製代碼。 – Christian

0

在我的網站不是很好,這個元標記中導致錯誤:

<base href="http://www.SITEURL.COM" /> 

我有一個下拉列表,我更新另一個下拉列表更改選擇。所以當回發發生時(下拉#2改變了索引),我得到了異常。

我試圖從應用的machineKey到web.config文件和設置theese一切屬性頁面

EnableViewState="false" EnableViewStateMac="false"

0

我使用針對Windows Web服務器2008 VS 2010和我終於找到了我在webconfig的appSettings部分中爲同一服務設置了兩個密鑰。我去了IIS並檢查了虛擬目錄上的應用程序設置,並得到了一個錯誤,將其修復到WebConfig中並解決了問題。我確實創建了一個機器密鑰,但沒有解決問題。也做了

pages (...) validateRequest="false" enableEventValidation="false" enableViewStateMac="false" viewStateEncryptionMode ="Never"/

設置。 FWIW ...

2

有一件事情我也碰到過,導致這個問題是與web服務器上的應用程序,池回收的時間間隔做。

我通過看所謂的「網絡事件」,在事件查看器/應用程序日誌事件信息和「任務類別」發現了這個。然後在此事件發生的時間段內,我查看是否有任何發生在此之前的事件(事件查看器/系統日誌和「源」被稱爲「WAS」)

默認情況下,池將每1740分鐘(29小時)循環使用。如果這個循環發生在用戶是忙在網站上,併發送回發到服務器,服務器不再識別該會話/視圖狀態和拒絕什麼被調回。

爲了克服這個從我們的角度是設置循環事件在一天中的特定時間發生的時候,我們不希望在網站上的活動。我們在早上凌晨3點的情況下。

。希望幫助那裏的人。

0

我用這個Microsoft article創建自己的machineKey的validationKey和decryptionKey。正如其他人所說,這可以放在web.config的system.web部分,但如果其他人獲得了密鑰,則存在安全問題。

相關問題