Azure + SignalR - 将集线器保护到不同的连接类型

时间:2014-04-29 09:26:41

标签: azure signalr

我在网络角色中有两个中心,

1)面向外部的集线器意味着在网站用户的https外部端点上使用。

2)旨在通过辅助角色连接到内部端点上的http。

我希望能够以某种方式保护对集线器的访问。

无论如何,我可以查看连接用户/辅助角色正在使用的连接类型,并基于此接受/拒绝?

我想到的另一种方法可能是在内部集线器上使用证书身份验证,但我不需要考虑速度等。

GlobalHost.DependencyResolver.UseServiceBus(connectionString, "web");

// Web external connection
app.MapSignalR("/signalr", new HubConfiguration() 
     { EnableJavaScriptProxies = true, EnableDetailedErrors = false });

// Worker internal connection
app.MapSignalR("/signalr-internal", new HubConfiguration() 
     { EnableJavaScriptProxies = false, EnableDetailedErrors = true});    

编辑:我已经包含了我自己的答案

2 个答案:

答案 0 :(得分:1)

一个简单的解决方案,您可以使用客户端的角色来区分连接

    object GetAuthInfo()
    {
        var user = Context.User;
        return new
        {
            IsAuthenticated = user.Identity.IsAuthenticated,
            IsAdmin = user.IsInRole("Admin"),
            UserName = user.Identity.Name
        };
    }

还完整描述了其他选项here

答案 1 :(得分:1)

我最终在自定义AuthorizeAttribute中探测请求环境变量并检查服务器localPort和请求方案。目前唯一的缺点是javascript代理仍将生成受限制的集线器信息。但我正在努力:)。

我会暂时搁置这个问题,看看是否有人可以延伸这个问题。

public class SignalrAuthorizeAttribute : Microsoft.AspNet.SignalR.AuthorizeAttribute, Microsoft.AspNet.SignalR.IDependencyResolver
{
    public override bool AuthorizeHubConnection(Microsoft.AspNet.SignalR.Hubs.HubDescriptor hubDescriptor, Microsoft.AspNet.SignalR.IRequest request)
    {
        bool isHttps = request.Environment["owin.RequestScheme"].ToString().Equals("https", StringComparison.OrdinalIgnoreCase) ? true : false;
        bool internalPort = request.Environment["server.LocalPort"].ToString().Equals("2000") ? true : false;

        switch(hubDescriptor.Name)
        {
            // External Hubs
            case "masterHub":
            case "childHub":
                if (isHttps && !internalPort) return base.AuthorizeHubConnection(hubDescriptor, request);
                break;
             // Internal hubs
            case "workerInHub":
            case "workerOutHub":
                if (!isHttps && internalPort) return base.AuthorizeHubConnection(hubDescriptor, request);
                break;
            default:
                break;
        }
        return false;
    }
}