我有一个SignalR应用程序。托管在Windows服务中(使用OWIN& Katana作为自托管),它正在mydomain.com上听取:8080
在同一台服务器上,我还有一个MVC应用程序,它基本上是一个连接到我上面提到的SignalR中心的网站。
我想限制只对我的MVC应用程序访问我的SignalR应用程序。我在互联网上搜索过但没有这样的例子。
有可能实现这一目标吗?如何获取有关连接是来自我的MVC应用程序还是来自其他应用程序的信息?我是否需要为自己的MVC应用程序实现授权才能连接到我的SignalR应用程序?
现在,互联网上的每个人都可以访问mydomain.com:8080/signalr端点,这基本上意味着竞争对手可以编写连接到我的SignalR集线器并使用它的客户端。有哪些选项可以阻止这种情况?
p.s:如果您需要,请询问更多信息 - 而不是仅仅将帖子标记为“非建设性”,因为我不知道这个问题如何被提出更具“建设性”
答案 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,请求将停在那里。
答案 1 :(得分:0)
只使用cors选项而不是编写代码。在cors只允许您的域