2009-09-01 85 views
19

出版我的ASP.NET MVC Web應用程序的一個新的版本後,我經常會看到這樣的例外在瀏覽網站的時候拋出:的ViewState MAC的ASP.NET MVC驗證失敗

System.Web.Mvc.HttpAntiForgeryException:所需的防僞標記未提供或無效。 ---> System.Web.HttpException:viewstate MAC的驗證失敗。如果此應用程序由Web Farm或羣集託管,請確保配置指定相同的驗證密鑰和驗證算法。 AutoGenerate不能在羣集中使用。 ---> System.Web.UI.ViewStateException:無效的視圖狀態。

在我訪問我的Web應用程序的每個頁面上,這個異常都會繼續發生,直到我關閉Firefox。重新打開Firefox後,該網站完美運行。任何想法發生了什麼?

其他注意事項:

  1. 我沒有使用任何ASP.NET Web控件(也有在我的應用程序RUNAT = 「服務器」 的任何實例)
  2. 如果我拿出<%= HTML .AntiForgeryToken%>從我的網頁,這個問題似乎消失

回答

32

在封面下,MVC AntiForgeryToken屬性使用machinekey進行加密。如果您沒有在web.config中指定機器密鑰(請參閱here),ASP.NET會自動爲您生成一個機器密鑰(full description)。

如果ASP.NET應用程序重新啓動(例如做一個IISRESET),瀏覽器cookie中的AntiForgeryToken仍然會與舊的機器密鑰加密的,因此它以上述錯誤崩潰。

因此,在使用MVC時,您應該始終在您的web.config中指定一個machinekey,例如,

<configuration> 
    <system.web> 
     <machineKey 
      validationKey="21F090935F6E49C2C797F69BBAAD8402ABD2EE0B667A8B44EA7DD4374267A75D7AD972A119482D15A4127461DB1DC347C1A63AE5F1CCFAACFF1B72A7F0A281B"   
      decryptionKey="ABAA84D7EC4BB56D75D217CECFFB9628809BDB8BF91CFCD64568A145BE59719F" 
      validation="SHA1" 
      decryption="AES" 
     /> 
    ... 
+0

即使輸入machineKey,我仍然收到錯誤。難道是服務器上的machine.config(我沒有訪問到這個)配置不正確? – jesperlind 2009-11-12 01:54:40

+0

@jesperlind :(有點晚,但任何人閱讀這可能會有所幫助...)你仍然得到的錯誤,因爲你有一個來自添加機器密鑰之前的cookie。如果您將機器鑰匙從頭開始鎖定,它將無法順利運行。 – Guffa 2011-10-21 07:53:08

+4

注意:請勿使用上述代碼中的確切機器密鑰。如果所有網站都有相同的機器密鑰,則很容易規避。使用在線機密鑰生成器生成唯一密鑰,例如http://aspnetresources.com/tools/machineKey – Guffa 2011-10-21 08:21:10

1

如果您在服務器場,請確保您的機器密鑰在每臺服務器是相同的。

0

我也有這個問題,並期望用戶清除緩存,Cookie或刷新頁面是不可接受的。

將機器鍵添加到web.config將解決此問題。我使用這個工具來快速生成一個密鑰,所以我沒有在開發過程中看到這些錯誤,然後在網站投入生產時正確生成一個密鑰。

http://aspnetresources.com/tools/machineKey

+1

鏈接已過時。 – Matty 2016-04-22 08:32:47