如何限制SignalR服务器连接?

时间:2014-04-29 23:28:42

标签: signalr owin signalr-hub self-hosting

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

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

我想限制只对我的MVC应用程序访问我的SignalR应用程序。我在互联网上搜索过但没有这样的例子。

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

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

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

2 个答案:

答案 0 :(得分: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;
    }
}

所有这一切都是检查Referer头的主机/权限是否与硬编码头匹配,如果匹配则返回true。

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

[CustomAuthorize]
public class ChatHub : Hub
{
    //Hub code here...
}

如果CustomAuthorize返回false,请求将停在那里。 OnConnected()。

答案 1 :(得分:0)

只使用cors选项而不是编写代码。在cors只允许您的域