I got this exception with SignalR, deployed in Azure WebSites. It works fine in debug environment. It\'s SignalR 1.0.1 and I use .NET MVC and WebApi
The data
This is the single post that allowed my to resolve this same issue using the following code. dfowlers mention of registering an instance of IProtectedData led me to search and find the definition here.
Note this issue was not encountered when using the Visual Studio development server, but when moving to live. I'm glad I found this post, as I have no idea how I would have been supposed to know to implement IProtectedData otherwise. Maybe there's something deeper in the documentation.
Whether or not this is 100% the correct solution I'm not sure, but this worked for me. I created a class implementing IProtectedData, and then registered that with Ninject.
Class:
using Microsoft.AspNet.SignalR.Infrastructure;
namespace Fwr.DataTeamUploader.Logic
{
public class ProtectedData : IProtectedData
{
// Obviously this isn't doing much to protect the data,
// assume custom encryption required here
// To reiterate, no encryption is VERY^4 BAD, see comments.
public string Protect(string data, string purpose)
{
return data;
}
public string Unprotect(string protectedValue, string purpose)
{
return protectedValue;
}
}
}
Ninject registration:
/// <summary>
/// Load your modules or register your services here
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
...
kernel.Bind<IProtectedData>().To<ProtectedData>();
...
For others coming to this page, I had the same issue but the solution was much simpler. As mentioned in comments above, the accepted answer is bad. Also mentioned is that SignalR defaults to use MachineKeyDataProtector
for IProtectedData
. MapHubs
and MapConnection
both call a function InitializeProtectedData
which registers MachineKeyDataProtector
with the dependency resolver.
My problem was that I was mapping my SignalR routes, and THEN configuring the dependency resolver
RouteTable.Routes.MapConnection<SomeEndpoint>("SomeEndpoint", "SomeEndpointUrl");
GlobalHost.DependencyResolver =
new StructureMapDependencyResolver(ObjectFactory.Container);
So basically the IProtectedData resolver registration done by MapConnection -> InitializeProtectedData was getting blown away when I registered my custom resolver. Simple fix, set the resolver BEFORE mapping the connection.
GlobalHost.DependencyResolver =
new StructureMapDependencyResolver(ObjectFactory.Container);
RouteTable.Routes.MapConnection<SomeEndpoint>("SomeEndpoint", "SomeEndpointUrl");
Now in this case, you can now use the extension method MapsHubs()
from Microsoft.AspNet.SignalR.SystemWeb
package.
MachineKeyProtectedData
will be used instead of the default implementation.
I do not believe Azure Websites are able to communicate with certificates/crypto API. Similar issues occur when trying to call Azure Management API. The user context under which the Sites are running appears to not have enough permissions to do so.