如何限制SignalR服务器连接?

6
我有一个SignalR应用程序,托管在Windows服务中(使用OWIN和Katana作为自托管),它正在侦听mydomain.com:8080。在同一台服务器上,我还有一个MVC应用程序,它基本上是连接到我上面提到的SignalR hub的网站。我想将对我的SignalR应用程序的访问限制为仅限于我的MVC应用程序。我已经在互联网上搜索过,但没有找到此类示例。是否可以实现这一点?如何获取关于连接是否来自我的MVC应用程序或其他应用程序的信息?我需要为自己的MVC应用程序实现授权才能连接到我的SignalR应用程序吗?目前,每个人都可以访问mydomain.com:8080/signalr端点,这基本上意味着竞争对手可以编写连接到我的SignalR hub并使用它的客户端。有哪些选项可防止这种情况发生?注:如果您需要更多信息,请询问,而不是只将帖子标记为“无建设性”。
2个回答

11

我相信我有一个可工作的示例,它虽然简单粗糙,但应该可以胜任工作,而且您应该能够扩展它以更好地满足您的需求:

我创建了一个继承自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,请求将在那里停止。Hub的OnConnected()将不会被触发。


太棒了,我回到家后会尝试它。不过有一个问题:每个访问网站的客户端的主机地址都将是mydomain.com:8080吗?我猜测mvc应用程序在连接到SignalR时传递了客户端的主机地址,是这样吗? - Tequilalime
最好检查引用来源是否为空值:如果(!string.IsNullOrEmpty(referer)) { - undefined

0

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


我认为Tobias的答案也是正确的,但这是更好的方式。 - Sajjad.HS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接