2011-10-11 52 views
3

我們使用FormsAuthentication類在經典ASP系統和.NET系統之間傳遞加密令牌。我們有一個由傳統ASP系統調用的COM組件(.NET 2),以及直接在.NET中使用的相同類。ASP.NET FormsAuthentication - 要解密的數據的長度無效

的代碼看起來是這樣的(沒有硬編碼值):

FormsAuthentication.Initialize(); 
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, "", new DateTime(2011, 1, 1), new DateTime(2012, 1, 1), false, "TEST"); 
var token = FormsAuthentication.Encrypt(ticket); 

要解密,我們這樣做:

var data = FormsAuthentication.Decrypt("E03519434CB6C157C24B5A1BFE3964537D9B0(SNIP)").UserData; 

兩個部分,目前在同一臺服務器上運行,然而,當這些系統位於不同服務器上時,我們有一個machineKey集。一切運行在.NET 3.5/CLR 2.

最近,我們已經將系統的.NET部分升級到.NET 4.本地方面,經典ASP的東西運行在另一臺服務器上,所以我們再次在我們的本地機器(.NET)和運行傳統ASP的服務器上設置了相同的machineKey。 machineKey在32 + 64位v2 machine.configs 都設置32 + 64位v4 machine.config(注意:我們以32位模式爲一些傳統COM組件運行IIS)。

在本地,我們沒有任何問題,在我們的本地機器(.NET 4)上運行的經典ASP系統(COM組件,運行在CLR 2中)上生成的令牌根本沒有問題。然而,當我們剛開始推出這一臨時服務器,我們得到以下錯誤:

System.Security.Cryptography.CryptographicException: Length of the data to decrypt is invalid. 
at System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) 
at System.Security.Cryptography.CryptoStream.FlushFinalBlock() 
at System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(Boolean fEncrypt, Byte[] buf, Byte[] modifier, Int32 start, Int32 length, Boolean useValidationSymAlgo, Boolean useLegacyMode, IVType ivType) 
at System.Web.Security.FormsAuthentication.Decrypt(String encryptedTicket) 
at NewMind.Tourism.DMS.Sso2.Sso.GetUserData(String dmsId, String token) in c:\CI\W\DMS-2.4-Release\NewMind.Tourism.DMS.Sso2\Sso.cs:line 131 
at NewMind.Tourism.Core.Utils.SsoUtil.GetUserData(String token) in c:\CI\W\DMS-2.4-Release\NewMind.Tourism.Core\Utils\SsoUtil.cs:line 37 
at NewMind.Tourism.Core.AuthenticationService.DoSsoLogin(String ssoToken, Action successAction, Action failureAction) in c:\CI\W\DMS-2.4-Release\NewMind.Tourism.Core\AuthenticationService.cs:line 126 

我花了整個下午都試圖追查原因。我發現了很多關於「aspnet:UseLegacyEncryption」的文章,它似乎解決了很多問題,但這對我們來說似乎沒有任何區別。我創建了試圖解密我的本地機器上生成兩個標記(一個在.NET 2,一個在.NET 4中),並在這兩個的CLR在兩臺機器上運行一個小的測試腳本:

  • 在我的機器,CLR 2 ** **工作
  • 在我的機器,CLR 4 ** **工作
  • 級服務器,CLR 2 ** **工作
  • 級服務器,CLR 4 **錯誤**
  • Stage sever,CLR 4,aspnet:UseLegacyEncryption = true **錯誤**

我已經用完了想法。我不太確定要嘗試什麼。 machineKeys都是相同的,我已經三重檢查。 UserLegacyEncryption選項似乎沒有區別。我無法比較每臺機器/ CLR上生成的令牌,因爲它們每次都不相同。我們不知道爲什麼完全相同的代碼在我們的開發機器上完全相同版本的.NET框架上工作。

我們的備份計劃是創建COM組件的CLR 4版本,或完全更改加密,但我們真的只想瞭解問題並能夠修復它。

+0

在ASP.NET 4.0中,默認的散列算法從SHA1更改爲SHA256。在你的COM組件中,你是否指定了一個明確的鍵,但沒有指定要使用的算法? –

+0

我看不到任何方式來指定 - 我們唯一的代碼是上面兩個代碼塊中的代碼。 –

+1

你確定服務器已修補嗎? – Buildstarted

回答

3

原來我們錯過了一個補丁。服務器通常是完全修補的,但由於.NET 4最近才安裝,並且之後未進行修補,我們錯過了修改加密的修補程序(由於ASP.NET漏洞)。

感謝Damian Edwards + levib @ MS的幫助!

+1

缺少什麼補丁? – Buildstarted

+0

有很多遺漏(安裝了.NET 4,但是目前沒有安裝補丁!),但導致此問題的原因是這一個,我認爲:http://weblogs.asp.net/scottgu/存檔/ 2010/09/18 /重要-ASP淨安全vulnerability.aspx –

相關問題