2017-06-09 106 views
0

我已经发表了我的SignalR服务的URL http://localhost/signalrSignalR - 动态网址?

public class ChatHub : Hub 
{ 
    public void Send(string name, string message) 
    { 
     Clients.All.sendMsg(name, message); 
    } 
} 

我需要限制该服务的调用,该URL必须具有一些独特的ID,如http://localhost/signalr/123然后我可以调用Send方法。

那么,在这里使用类似URL路由的东西有没有可能性?而且,在我进入该方法之前,如何获得该ID?

回答

1

SignalR请求中的URL仅适用于初始设置调用。这些初始设置请求路径由SignalR库格式化,但可以将查询字符串参数添加到SignalR请求中。在调用$ .connection.hub.start之前,通过在客户端Javascript中添加以下代码行来完成此操作。

$.connection.hub.qs = { 'X-UniqueID': 123 }; 

然后,授权基于特殊的ID,你会做定制权威性的SignalR集线器的连接(注意,微软对这个话题的文章:https://docs.microsoft.com/en-us/aspnet/signalr/overview/security/hub-authorization是缺乏大量的信息,但是我已经发布了在底部留下必要的信息,说明如何完成)。您通过以下方式完成此操作:

1)向您的项目添加一个名为CustomAuthAttribute的类,并从Microsoft.AspNet.SignalR.AuthorizeAttribute继承,为该类提供必要的装饰。

2)重写AuthorizeHubConnection方法并基于查询字符串验证请求。

3)您也可以重写AuthorizeHubMethodInvocation来检查每个Web套接字请求。

4)用CustomAuth标记装饰Hub类。

到底你的类可能是这样的:

[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] 
public class CustomAuthAttribute : AuthorizeAttribute 
public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request) 
{ 
    if (request.QueryString["X-UniqueID"] == "123") 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubContext, bool appliesToMethod) 
{ 
    return true; // or do some validation 
} 

而且集线器应该是这样的:

[CustomAuth] 
public class myHub : Hub //Or some other name 

现在,如果你确实设置某种独特的ID对每个网络套接字调用,那么你必须在客户端的每次调用中手动设置参数。我给你的方法是如何限制或允许连接本身。但是,如果您想允许连接,然后将呼叫限制为特定的方法,那么您也可以使用此方法。您可以在查询字符串上设置所需数据,然后从AuthorizeHubMethodInvocation内引用回原始连接上下文。

但是,如果你使用这个认证/授权,我不能真正告诉你你的方案是否安全。这一切都取决于你如何设置一切。我可以告诉你,这是你如何做自定义身份验证。

我在自己的代码中实际做的是将用户数据保存在连接请求的HttpContext.Current.Items集合中(因为我使用的是IIS System.Web),然后在AuthorizeHubMethodInvocation上访问它,因为HttpContext.Current.Items集合在连接期间仍可访问。