2017-08-02 12 views
1

私のWeb API 2プロジェクトでは、JWTベースの認証があります。構成はSignalR 2.0のIAuthenticationFilter

var config = new HttpConfiguration(); 
    app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions {/**/}); 
    config.Filters.Add(new MyAuthenticationFilter()); 
    app.UseWebApi(config); 
    app.UseCors(CorsOptions.AllowAll); 
    app.MapSignalR(); 

MyAuthenticationFilter、着信JWTに基づいてカスタムプリンシパルを構築し、私のコントローラのアクションで、私はthis.Userとしてそれにアクセスできるように、要求にそれを添付しています。すべては、フィルタを除いて正常に動作しているがSignalR要求を無視されます。

public class MyHub : Hub { 
    public override Task OnConnected() { 
     // here Context.User is ClaimsPrincipal which contain a JWT from Authorization header 
     // I expect it to be MyCustomPrincipal 
     return base.OnConnected(); 
    } 
} 

IAuthenticationFiltterが無視されるのはなぜ?どうすれば修正できますか?

答えて

1

signalRでヘッダにjwtを使用することはできません。 qs(クエリ文字列)でjwtを送信し、下にコードするapiにいくつかのカスタマイズを追加します。

App_Start/Startup.Auth.cs

public void ConfigureAuth(IAppBuilder app) 
     { 
      // SignalR Auth0 custom configuration. 
      app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions() 
      { 
       Provider = new OAuthBearerAuthenticationProvider() 
       { 
        OnRequestToken = context => 
        { 
         if (context.Request.Path.Value.StartsWith("/signalr")) 
         { 
          string bearerToken = context.Request.Query.Get("token"); 
          if (bearerToken != null) 
          { 
           string[] authorization = new string[] { "bearer " + bearerToken }; 
           context.Request.Headers.Add("Authorization", authorization); 
          } 
         } 

         return null; 
        } 
       } 
      }); 
    } 

、あなたはハブの承認属性を使用

[Authorize] 

public class MyHub:Hub