2017-06-09 140 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集合在連接期間仍可訪問。