我在网络角色中有两个中心,
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});
编辑:我已经包含了我自己的答案
答案 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;
}
}