2009-11-02 77 views
7

我正在使用ELMAH處理我的MVC網站中的錯誤,並且我注意到在過去的幾周裏我收到了一些CryptographicExceptions拋出。該消息是:ASP.MVC防僞令牌和加密錯誤

System.Security.Cryptography.CryptographicException:填充無效,無法刪除。

System.Web.Mvc.HttpAntiForgeryException: 必需的防僞標記不是 提供的或無效的。 ---> System.Web.HttpException:viewstate MAC的驗證 失敗。如果這個 應用程序由Web Farm或 羣集託管,請確保 配置指定了相同的 validationKey和驗證 算法。 AutoGenerate不能在羣集中使用 。 --->

該應用程序未在羣集中運行,我似乎無法重現這些錯誤。它們看起來像有效的請求 - 不是手工製作的帖子 - 並且包含__RequestVerificationToken cookie。我在頁面上的窗體(我的登錄窗體)中有必要的HTML幫助器。

我還沒有任何用戶投訴,所以我假設最終它適用於任何正在嘗試登錄的人,但我仍然想知道爲什麼會發生這種情況。

任何人看到這種行爲或對如何診斷異常有任何想法 - 就像我說的,我不能讓它失敗。在FF中刪除cookie會出現不同的錯誤。修改cookie(更改或刪除內容)也會導致不同的錯誤,就像修改頁面上隱藏令牌輸入的內容一樣。

回答

4

我不確定是否存在關聯,但在添加排除我的登錄操作的robots.txt文件後,我不再看到這些錯誤。我懷疑它與爬行器打到頁面並試圖調用登錄操作有關。

編輯:我也看到這個問題,當應用程序池回收後收到舊的cookie。我已經明確地設置了machineKey,以便應用程序重新啓動時驗證/解密密鑰的更改不會影響可能會重新發送的舊Cookie。

在更新站點並轉到固定的machineKey後,我發現我仍然從以前版本的cookie中獲取這些錯誤。作爲臨時解決方案,我添加了以下Application_Error處理程序:

public void Application_Error() 
    { 
     var exception = Server.GetLastError().GetBaseException(); 
     if (exception is System.Security.Cryptography.CryptographicException) 
     { 
      Server.ClearError(); 
      if (Request.IsAuthenticated) 
      { 
       var form = new FormsAuthenticationWrapper(); 
       form.SignOut(); 
       Session.Clear(); 
      } 
      Response.Cookies.Clear(); 
      Response.Redirect("~"); 
     } 
    } 
+0

machineKey是正確的解決方案。 – 2010-09-10 13:48:55

+0

類似體驗 - 我的博客在我將其遷移到ASP.NET MVC 2後開始間歇性崩潰。增加了machineKey,問題消失了。 – 2010-09-10 13:49:23

1

我不太確定這與防僞系統有什麼特別的關係,內在的例外狀態是'視圖狀態MAC驗證失敗'。',據我所知,防僞造系統的默認基礎設施具有依賴性在視圖狀態(實際上,如果你看到take a look here,你會看到依賴和恐怖(底部的CreateFormatterGenerator方法))。

至於爲什麼viewstate mac在虛假請求上失敗,我不確定 - 但是由於在反序列化防僞令牌(處理整個虛假請求)時存在恐怖,它根本不會讓我感到驚訝..