如何限制SignalR服务器连接?

Ala*_*nut 5 self-hosting signalr signalr-hub owin

我有一个SignalR应用程序.托管在Windows服务中(使用OWIN和Katana作为自托管)并且正在mydomain.com上听取:8080

在同一台服务器上,我还有一个MVC应用程序,它基本上是一个连接到我上面提到的SignalR集线器的网站.

我想限制只对我的MVC应用程序访问我的SignalR应用程序.我搜索过互联网,但没有举例说明这一点.

是否有可能实现这一目标?如何获取有关连接是来自我的MVC应用程序还是来自其他应用程序的信息?我是否需要为自己的MVC应用程序实现授权才能连接到我的SignalR应用程序?

现在,互联网上的每个人都可以访问mydomain.com:8080/signalr端点,这基本上意味着竞争对手可以编写连接到我的SignalR集线器并使用它的客户端.有哪些选项可以防止出现这种情况?

ps:请提供更多信息 - 如果您需要 - 而不是仅仅将帖子标记为"非建设性",因为我不知道这个问题如何被提出更具"建设性"

Tob*_*ias 8

我相信我有一个工作的例子,它快速而且肮脏,但它应该完成这项工作,你应该能够扩展它以便更好地满足你的需求:

我创建了一个继承Microsoft.AspNet.SignalR.AuthorizeAttribute和覆盖AuthorizeHubConnection方法的类:

[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public class CustomAuthorize : AuthorizeAttribute
{

    public override bool AuthorizeHubConnection(Microsoft.AspNet.SignalR.Hubs.HubDescriptor hubDescriptor, IRequest request)
    {
        string referer = request.Headers["Referer"];
        string authority = new Uri(referer).Authority;
        if (authority == "mydomain.com:8080")
        {
            return true;
        }
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

它只是检查Referer头的主机/权限与硬编码的主机/权限,如果匹配则返回true.

然后你可以像这样使用它:

[CustomAuthorize]
public class ChatHub : Hub
{
    //Hub code here...
}
Run Code Online (Sandbox Code Playgroud)

如果CustomAuthorize返回false,则请求将停在那里.集线器OnConnected()不会被触发.