我们使用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中运行它:
我已经没想完了。我不太确定该尝试什么。机器钥匙都是相同的,我已经三重检查了。 UserLegacyEncryption选项似乎没有什么区别。我无法比较每台机器/ CLR上生成的令牌,因为它们每次都不同。我们不知道为什么完全相同的代码在我们的dev机器上完全相同的.NET框架版本上工作。
我们的备份计划是创建COM组件的CLR 4版本,或完全更改加密,但我们真的只想了解问题并能够解决它。
答案 0 :(得分:3)
原来我们错过了补丁。服务器通常是完全修补的,但由于.NET 4最近才安装,并且之后没有修补,我们错过了更改加密的补丁(由于ASP.NET漏洞利用)。
感谢Damian Edwards + levib @ MS的帮助!