2017-01-25 5 views
0

私はSignalR.Hubで作業しており、SignalR.AuthorizeAttributeでカスタム認可を取得しています。私は、ハブを使用するためにユーザーが認証されたことを確認するために取得するセッションをパスしようとしています。SignalR.AuthorizeAttributeからSignalR.Hubへのセッションを取得する

私はすべてのプロパティを調べました。ほとんどの場合、読み取り専用です。私はSignalR.IRequest.Environmentに何かを追加することができますが、スレッドセーフではないようであり、不適切と思われます。

HubCallerContext +私のセッションでタックできる方法でそれを使用するすべてを拡張できますか?

カスタム認証

[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] 
public class HubAuthorize : AuthorizeAttribute 
{ 
    public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request) 
    { 
     return VerifySession(request); 
    } 

    public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext, bool appliesToMethod) 
    { 
     //Could I add something to the HubIncomingInvokerContext? 
     return VerifySession(hubIncomingInvokerContext.Hub.Context.Request); 
    } 

    public bool VerifySession(IRequest request) 
    { 
     bool success = false; 
     string token = ""; 
     bool isApiToken = false; 

     // Check for token Header Auth 
     if (string.IsNullOrWhiteSpace(token)) 
     { 
      token = request.QueryString["X-Custom-Token"]; 
      if (string.IsNullOrWhiteSpace(token)) 
      { 
       token = request.QueryString["X-Custom-Token"]; 
       isApiToken = true; 
      } 
     } 

     SessionResponse session = null; 
     if (!string.IsNullOrWhiteSpace(token)) 
     { 
      session = isApiToken ? ValidateApiToken(token) : ValidateToken(token); 
     } 

     if (session != null) 
     { 
      //Add Session to request! So I dont have to hit the db again.. 
      //request.Add(new KeyValuePair<string, object>("session", session)); 
      success = true; 
     } 
     return success; 
    } 

    //... other methods that aren't relevant 
} 

あなたはあなたが認証されていることを確認したときにセッションを取得するためにそれを使用傾ける場合はハブ

[HubAuthorize] 
public class NotificationHub : Hub 
{ 
    public void Send(string name, string message) 
    { 
     // Use the session here 
     Clients.All.broadcastMessage(name, message); 
    } 

    public override Task OnConnected() 
    { 
     Console.WriteLine(Context.ConnectionId); 
     return base.OnConnected(); 
    } 
} 

はなぜカスタム権限を持っていますか?たぶん私は何かが欠けているかもしれませんが、かなりイライラしています。/endrant

答えて

0

そうではありません。私はHubAuthorize.AuthorizeHubConnectionでセッションを確認してから、NotificationHub.OnConnectedでContext.ConnectionIdの辞書をキーとして作成し、値のセカンダリ時間を取得します。ハックしているようだが、.Net組み込みの認証を使わずに人々がハブにアクセスするのを防ぐ良い方法ではないようだ。

関連する問題