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集合在连接期间仍可访问。
来源
2017-06-09 22:19:48
Ian