2017-08-02 5 views
1

In meinem Web-API-2-Projekt habe ich JWT-basierte Authentifizierung. Die Konfiguration istIAuthenticationFilter in SignalR 2.0

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

MyAuthenticationFilter eine benutzerdefinierte Haupt baut auf der Grundlage einer eingehenden JWT und legt es auf eine Anfrage, so dass in meinem Controller-Aktionen ich es als this.User zugreifen können. Alles funktioniert gut, außer der Filter für SignalR Anfragen ignoriert wird:

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(); 
    } 
} 

Warum IAuthenticationFiltter ignoriert wird? Wie repariere ich das?

Antwort

1

Sie können JWT auf Header mit SignalR nicht verwenden. Senden Sie jwt in qs (Abfragezeichenfolge) und fügen Sie einige Anpassungen auf api diesen Code unten hinzu.

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; 
        } 
       } 
      }); 
    } 

und Sie autorisieren Attribut auf der Nabe

[Authorize] 

public class MyHub:Hub