SignalR - 指定的解密密钥具有无效的十六进制字符

时间:2016-07-04 13:34:58

标签: c# asp.net-mvc web-config signalr

我正在使用SignalR 2.2.0和MVC 4.当我在Chrome中加载页面时,我在控制台中收到错误:

http://localhost:8180/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D&_=1467627883530 500 (Internal Server Error)

使用Fiddler进一步检查后,我可以查看堆栈跟踪:

[ConfigurationErrorsException]: Decryption key specified has invalid hex characters. (C:\Users\Foo\web.config line 66)

   at System.Web.Security.Cryptography.MachineKeyMasterKeyProvider.GenerateCryptographicKey(String configAttributeName, String configAttributeValue, Int32 autogenKeyOffset, Int32 autogenKeyCount, String errorResourceString)
   at System.Web.Security.Cryptography.MachineKeyMasterKeyProvider.GetEncryptionKey()
   at System.Web.Security.Cryptography.Purpose.GetDerivedEncryptionKey(IMasterKeyProvider masterKeyProvider, KeyDerivationFunction keyDerivationFunction)
   at System.Web.Security.Cryptography.AspNetCryptoServiceProvider.GetNetFXCryptoService(Purpose purpose, CryptoServiceOptions options)
   at System.Web.Security.Cryptography.AspNetCryptoServiceProvider.GetCryptoService(Purpose purpose, CryptoServiceOptions options)
   at System.Web.Security.MachineKey.Protect(ICryptoServiceProvider cryptoServiceProvider, Byte[] userData, String[] purposes)
   at System.Web.Security.MachineKey.Protect(Byte[] userData, String[] purposes)
   at Microsoft.Owin.Host.SystemWeb.DataProtection.MachineKeyDataProtector.Protect(Byte[] userData)
   at Microsoft.Owin.Security.DataProtection.AppBuilderExtensions.CallDataProtectionProvider.CallDataProtection.Protect(Byte[] userData)
   at Microsoft.AspNet.SignalR.Infrastructure.DataProtectionProviderProtectedData.Protect(String data, String purpose)
   at Microsoft.AspNet.SignalR.PersistentConnection.ProcessNegotiationRequest(HostContext context)
   at Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(HostContext context)
   at Microsoft.AspNet.SignalR.Hubs.HubDispatcher.ProcessRequest(HostContext context)
   at Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(IDictionary`2 environment)
   at Microsoft.AspNet.SignalR.Owin.Middleware.HubDispatcherMiddleware.Invoke(IOwinContext context)
   at Microsoft.Owin.Infrastructure.OwinMiddlewareTransition.Invoke(IDictionary`2 environment)
   at Microsoft.Owin.Mapping.MapMiddleware.<Invoke>d__0.MoveNext()

根据我收集的内容,SignalR正在使用机器密钥执行某些加密/解密。

这就是机器键的样子:

<machineKey decryptionKey="5E329ED7DE2786FCD906E717C97A09BE26B3564BBE0A2B28,IsolateApps" validationKey="A64F709FB47B282CB8331205BC423D63450B4FFC92FE06EC1E00B3AE8B5B1F529A5CD1064F66C08545FC13B013F84153598B29213D5494DD5EC348B537A51DAE,IsolateApps"/>

我猜它在decryptionKey / validationKey中看到“IsolateApps”并抛出异常(“......无效的十六进制字符”)。

如果我从密钥中删除“IsolateApps”,我就无法登录,因为我正在使用FormsAuthentication,而FormsAuthentication又使用密钥加密/解密。因此,删除“IsolateApps”似乎不是一个解决方案。

PS。我正在使用的代码来自this教程。 我已经看过this answer,但它没有解决问题。我还尝试将compatibilityMode="Framework20SP1"添加到计算机密钥,但这也不起作用。

是否可以在不从Web配置中的键中删除“IsolateApps”值的情况下修复此问题?

1 个答案:

答案 0 :(得分:1)

我已经解决了这个问题。我决定从停止提供此异常的机器密钥中删除“,IsolateApps”属性:

  

指定的解密密钥具有无效的十六进制字符

删除此属性意味着我无法再登录(因为机器密钥已在技术上发生了变化),这迫使我重置了我的帐户密码。重置密码后,我可以继续登录。

一旦我能够登录,我就收到了这个错误:

  

WS:// XXXXX / signalr /连接传输的WebSockets =&安培; clientProtocol = 1.5&安培; connectionToken = XXXXX”   失败:在收到握手响应之前连接已关闭。

此异常仅在Chrome中被抛出。

SignalR回落到服务器发送的事件上,因为Web套接字握手没有成功。经过几个小时的调试后,我通过将其添加到Web配置来解决了这个问题:

<system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
    <pages controlRenderingCompatibilityVersion="4.0" />
</system.web>

一旦添加,SignalR就像另外一样运作。