2017-06-09 4 views
0

私は、例えば、URLはいくつかのユニークなIDを持っていなければならないことを、サービスへの呼び出しを制限する必要があるURL http://localhost/signalrSignalR - 動的URL?

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

に私SignalRサービスを公開していますhttp://localhost/signalr/123を呼び出して、Sendメソッドを呼び出すことができます。

ここでURLルーティングのようなものを使用する可能性はありますか?そして、その方法に入る前に、そのIDを取得するにはどうしたらいいですか?

答えて

1

URLのSignalR要求は、初期セットアップ呼び出しにのみ適用されます。これらの初期設定要求パスは、SignalRライブラリによってフォーマットされますが、QueryRequestにクエリ文字列パラメータを追加できます。 $ .connection.hub.startを呼び出す前に、クライアントJavascriptに次のコード行を追加してください。

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

その後、あなたはSignalRハブ用のカスタム認証を行うだろうという特別なIDに基づいて、接続を許可するために(このトピックに関するMicrosoftの記事があることに注意してください:、https://docs.microsoft.com/en-us/aspnet/signalr/overview/security/hub-authorizationは情報の多くを欠いているが、私が投稿しました一番下にコメントするには、それをどうやって行うのかについての必要な情報が必要です)。

1)プロジェクトにCustomAuthAttributeという名前のクラスを追加し、Microsoft.AspNet.SignalR.AuthorizeAttributeから継承して、必要な装飾をクラスに与えます。

2)AuthorizeHubConnectionメソッドをオーバーライドし、クエリ文字列に基づいて要求を検証します。

3)また、すべてのWebソケット要求をチェックするために、AuthorizeHubMethodInvocationを上書きすることもできます。

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 
} 

そして、あなたのハブには、次のようになります。あなたが実際にすべての上のユニークIDのいくつかの並べ替えを設定している場合は今

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

Webソケット呼び出しを使用する場合は、クライアントからのすべての呼び出しでパラメータを手動で設定する必要があります。私があなたに与えたアプローチは、接続自体を制限したり許可する方法です。ただし、接続を許可してから特定のメソッドに呼び出しを制限する場合は、この方法を使用することもできます。クエリ文字列に必要なデータを設定し、AuthorizeHubMethodInvocation内から元の接続コンテキストを参照することができます。

しかし、これを認証/認可に使用している場合は、あなたの体系が安全かどうかは分かりません。それはあなたが他のすべてをセットアップした方法に依存します。私はちょうどこれがあなたがカスタム認証を行う方法であることをあなたに伝えることができます。

私が実際に自分のコードで行うことは、(IIS System.Webを使用しているため)接続要求のHttpContext.Current.Itemsコレクションにユーザーデータを保存してから、AuthorizeHubMethodInvocationでアクセスすることですHttpContext.Current.Itemsコレクションは、接続中も引き続きアクセスできます。