SSL中的signalR自主服务器和Web客户端中的身份验证

时间:2013-04-24 19:29:51

标签: signalr signalr.client

我有一个singalR自我主机服务器,它在https上的控制台应用程序中托管我的singalR

我正在使用这个软件包来自托管:

  • 安装包Microsoft.Owin.Hosting -pre 安装包Microsoft.Owin.Host.HttpListener -pre 安装包Microsoft.AspNet.SignalR.Owin

我有一个由WebApi支持的Web客户端,我可以从我的webclient连接到我的自主设备singalR并发送消息但是我现在想要为此添加身份验证,这意味着只有登录的用户才能向我的自主设备发送消息singalR服务器。 我在方法

之前使用了[Authorize]属性
[Authorize]
public void Test(string test)
{
    Console.WriteLine(test);   
}

我通过表单身份验证完成了我的Web客户端身份验证,但是在我的webclient中成功登录后,当我调用singalR方法时,我收到了javascript错误

未捕获的值不能为空。参数名称:user

它告诉我的方法受到保护,但不知何故我的用户没有传递给我自己托管的singalR服务器,这里缺少什么?

2 个答案:

答案 0 :(得分:1)

SignalR 1.0引入了对此的支持,您可以在David Fowlers blog上阅读一些相关信息。问题是,它是如此新颖,有点稀疏记录。

我目前还不确定您的应用程序中发生了什么,但您可以在Stack Overflow上找到类似的问题,这可能有助于您走上正确的轨道:Integrating SignalR with existing Authorization

基本上,您可以创建一个实现IAuthorizeHubConnection和IAuthorizeHubMethodInvocation的SignalR属性,然后装饰您想要授权的集线器/方法。

public class HubAuthorizeAttribute : Attribute, IAuthorizeHubConnection, IAuthorizeHubMethodInvocation {

    public virtual bool AuthorizeHubConnection(HubDescriptor hubDescriptor, Microsoft.AspNet.SignalR.IRequest request) {

        IAuthorizationProvider authorizationProvider = DependencyResolver.Current.GetService<IAuthorizationProvider>();

        return authorizationProvider.IsAuthorizedController(hubDescriptor.Name);
    }    

    public virtual bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext) {

        IAuthorizationProvider authorizationProvider = DependencyResolver.Current.GetService<IAuthorizationProvider>();

        return authorizationProvider.IsAuthorizedAction(hubIncomingInvokerContext.MethodDescriptor.Hub.Name, hubIncomingInvokerContext.MethodDescriptor.Name);
    }
}

或者,您可以将HubAuthorizeAttribute添加为HubPipeline模块以全局要求授权。

var globalAuthorizer = new HubAuthorizeAttribute ();
GlobalHost.HubPipeline.AddModule(new AuthorizeModule(globalAuthorizer, globalAuthorizer));

答案 1 :(得分:0)

我在SignalR JabbR聊天的最后几天曾几次问过类似的问题而且没有得到任何答案。
当我在这里发布我的问题时,我发现了你的问题this other one。不幸的是,从几周前给出的答案来看,似乎SignalR本身不提供身份验证支持,因此对于许多自主应用程序来说这是一个巨大的问题(我们打算使用带有SignalR的集成Windows身份验证......)