2017-01-20 7 views
1

WebApiアプリケーションでSignalRを使用していて、正常に動作します。クライアントがWebSocketトランスポートを使用してハブに接続し、いくつかのカスタムミドルウェア認証があります。HubConnection.Startを呼び出すときにスローされるエラー:StatusCode:401、ReasonPhrase: '着信側のプリンシパルがnull'

私はハブメソッド呼び出し、その後、別のバックエンドアプリケーション(.NETクライアント)からこのハブに接続するために、私はハブの接続を行うとハブのプロキシを作成し、これを行うにしようとしています

string auth = "someEncryptedValue" 
HubConnection hubConn = new HubConnection("myUrl"); 
hubConn.Headers.Add("myauthtoken", auth); 
IHubProxy proxy = hubConn.CreateHubProxy("hubName"); 
Task t = Task.Run(() => hubConn.Start(new LongPollingTransport())); 
t.WaitAndUnwrap // An extension method 
hubProxy.Invoke("SendMessage", message); 

t.WaitAndUnwrap()が呼び出されたときに例外がスローされます(拡張メソッドは問題ありません)。私はHTTPヘッダートークンを追加する前に、この着信プリンシパルがヌル問題であった(もちろん、実際にはリテラル文字列 "someEncryptedValue"ではありません)。

[HeadersAuth] 
public class MyHub : Hub 
{ 
    // Hub logic 
} 

しかし、実行した後:

public class HeadersAuthAttribute : AuthorizeAttribute 
{ 
    public override bool AuthroizeHubConnection(HubDescriptor hubDescriptor, IRequest request) 
    { 
     string auth = request.Headers["myauthtoken"]; 
     if (auth == "someEncryptedValue") //again, this is actually more complex than shown here 
     { 
      return true; 
     } 
     else 
     { 
      // Need to check if the incoming principal is authenticated in case 
      // the connection to the hub is being made the normal way through the 
      // WebApi instead of the proxy using http headers 
      return request.User?.Identity?.IsAuthenticated ?? false; 
     } 
     return false; 
    } 
} 

そしてもちろん、私のハブは、ヘッダー属性があります。だから私はここに、その後、私は戻って私の他のアプリケーションでのハブのカスタム承認クラスを追加したことを追加しました私はまだ、受信側のプリンシパルにnullエラーが発生します。 WebSocketでカスタムhttpヘッダーを使用できないことを読んだので、new LongPollingTransport()を上記のhubConn.Startコールに入れます。しかし、それは何か変わっていないようで、少なくとも私が得るエラーではありません。

何が起こっているのでしょうか?実際のハブと権限でコードをデバッグできたら、hubConn.Start呼び出しが行われたときに何が起きているのかを見ることができます。 httpヘッダーが正しく設定され、正しくフェッチされているかどうかを確認する方法はありますか?着信プリンシパルがnullであるというエラーが発生した場合は、問題が認証されていますか?それは、ユーザーを見つけようとしているコードの別の部分かもしれませんか?このハブ接続が.NETクライアントから行われているため、どうしたらよいか分かりません。また、私はHeadersAuthAttributeクラスが呼び出されていることを知っています。通常、WebSocketを使用してハブに接続するときに正しく使用されます。なぜなら、IIdentityが認証されていることを確認するelseケースに入るからです。

ちょうど私が試したものの少しを追加する:

  • 私は別のエラーを取得するかどうかを確認するためにトークン意図的に誤った認証文字列を作ったが、私はまだ入ってくる校長がnullを取得。

  • OnConnected()私のハブのオーバーライドメソッドが、受信プライムをthis.Context.Userで使用しようとするメソッドを、nullであるかどうかをチェックせずに呼び出すことがわかった。私はそれを削除し、ハブで着信元を使用しようとするものはすべて削除しましたが、残念ながら同じエラーが表示されます。

答えて

0

私は何が間違っているかを考え出しました。私はこの記事を終えていると思ったので、ハブ認証とは関係ありませんでした。私のスタートアップファイルがapp.ConfigureAuthに電話をかけることが起こっていましたが、これは最終的に着信プリンシパルがヌルかどうかをチェックするOWINミドルウェアパイプラインのいくつかのカスタム認証につながります。私は、SignalR接続のためにそれを取り上げました。

私はそれが許可されていないので、私はプロキシからハブメソッドの呼び出しを行うことができなかったことに注意してください。私はhereからもらったHeadersAuthAttributeクラスに

public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext, bool appliesToMethod) 

を追加したことを修正します。