0

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

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

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

我有一个由 WebApi 支持的 Web 客户端,我可以从我的 Web 客户端连接到我的自托管 singalR 并发送消息,但是我现在想为此添加身份验证,这意味着只有登录的用户才能将消息发送到我的自托管 singalR 服务器。我在方法之前使用了 [Authorize] 属性

[Authorize]
public void Test(string test)
{
    Console.WriteLine(test);   
}

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

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

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

4

2 回答 2

1

SignalR 1.0 引入了对此的支持,您可以在David Fowlers 博客上阅读一些相关信息。问题是,它太新了,文档很少。

我不确定您的应用程序目前正在发生什么,但您可以在 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));
于 2013-04-29T16:03:41.387 回答
0

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

于 2013-04-27T16:37:51.053 回答