ASP.NET FormsAuthentication - 要解密的数据长度无效

时间:2011-10-11 15:35:40

标签: c# .net asp.net encryption webforms

我们使用FormsAuthentication类在Classic ASP系统和.NET系统之间传递加密的令牌。我们有一个由Classic ASP系统调用的COM组件(.NET 2),以及直接在.NET中使用的相同类。

代码看起来像这样(没有硬编码值):

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的东西在另一台服务器上运行,所以我们在本地机器上设置了相同的machineKey(.NET) )和服务器运行经典ASP的东西。同样的machineKey设置在32 + 64位v2 machine.configs 都是32 + 64位v4 machine.config(注意:我们在32位模式下运行IIS用于某些传统COM组件)。 / p>

在本地,我们在使用在我们的本地计算机(.NET 4)上运行的Classic ASP系统(在CLR 2中运行的COM组件)上生成令牌时没有任何问题。但是,当我们刚开始将其推送到登台服务器时,我们收到以下错误:

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 **工作**
  • Stage sever,CLR 2 ** Works **
  • Stage sever,CLR 4 **错误**
  • Stage sever,CLR 4,aspnet:UseLegacyEncryption = true **错误**

我已经没想完了。我不太确定该尝试什么。机器钥匙都是相同的,我已经三重检查了。 UserLegacyEncryption选项似乎没有什么区别。我无法比较每台机器/ CLR上生成的令牌,因为它们每次都不同。我们不知道为什么完全相同的代码在我们的dev机器上完全相同的.NET框架版本上工作。

我们的备份计划是创建COM组件的CLR 4版本,或完全更改加密,但我们真的只想了解问题并能够解决它。

1 个答案:

答案 0 :(得分:3)

原来我们错过了补丁。服务器通常是完全修补的,但由于.NET 4最近才安装,并且之后没有修补,我们错过了更改加密的补丁(由于ASP.NET漏洞利用)。

感谢Damian Edwards + levib @ MS的帮助!