2017-10-16 7 views
0

Ich verwende die JWT-Authentifizierung in meiner ASP.NET Core 2.0-Anwendung mit OpenIddict.So autorisieren Sie die SignalR Core Hub-Methode mit JWT

Ich folge Idee in this thread und Aufruf AuthorizeWithJWT Methode nach SignalR Handshake. Aber jetzt weiß ich nicht, was ich in AuthorizeWithJWT Methode einstellen soll, damit ich zum Beispiel [Authorize(Roles="Admin")] verwenden kann.

Ich habe versucht, mit der Einstellung Kontext Benutzer, aber es ist nur lesbar:

public class BaseHub : Hub 
{  
    public async Task AuthorizeWithJWT(string AccessToken) 
    { 
     //get user claims from AccesToken 
     this.Context.User = user; //error User is read only 
    } 
} 

Und Attribut genehmigen:

public class VarDesignImportHub : BaseHub 
{ 
    [Authorize(Roles = "Admin")] 
    public async Task Import(string ConnectionString) 
    { 
    } 
} 

Antwort

2

ich Ihnen dringend ermutigen tun Authentifizierung auf dem Handshake Ebene fortzusetzen, anstatt zu gehen mit einer benutzerdefinierten und nicht standardisierten Lösung, die Sie auf der SignalR-Ebene implementieren würden.

Vorausgesetzt, dass Sie die Validierungshandler verwenden, können Sie es zwingen, den Zugriffstoken aus der Abfrage-String abzurufen:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddAuthentication() 
     .AddOAuthValidation(options => 
     { 
      options.Events.OnRetrieveToken = context => 
      { 
       context.Token = context.Request.Query["access_token"]; 

       return Task.CompletedTask; 
      }; 
     }); 
} 

Oder OnMessageReceived wenn Sie JWTBearer verwenden möchten:

services.AddAuthentication() 
    .AddJwtBearer(o => 
    { 
     o.Events = new JwtBearerEvents() 
     { 
      OnMessageReceived = context => 
      { 
       if (context.Request.Path.ToString().StartsWith("/HUB/")) 
        context.Token = context.Request.Query["access_token"]; 
       return Task.CompletedTask; 
      }, 
     }; 
    }); 

Keine andere Änderung sollte erforderlich sein.

+0

Ja, das wäre ein gültiger Fall, aber wie in GitHub-Thread ([link1] (https://github.com/aspnet/SignalR/issues/888#issuecomment-330727192) erläutert, [link2] (https://github.com/aspnet/SignalR/issues/888#issuecomment-330721385)) mit diesem Ansatz bestehen einige Sicherheitsrisiken. Weil access_token in der Abfrage öffentlich ist (Sie können es protokollieren ...). Werde das tun, wenn kein anderer Ansatz möglich ist. – Makla

+0

Aber einmal Zugriffstoken könnte es tun? @Pinpoint Was denkst du? – Makla

+0

Das einzige "Risiko" besteht darin, dass das Zugriffstoken in die Protokolle eingeschlossen wird (was in der OAuth2-Trägerspezifikation klar erklärt wird). Um dies zu vermeiden, können Sie die Protokollierungsablaufverfolgungen einschließlich der Abfragezeichenfolge mithilfe der Filter-API deaktivieren. – Pinpoint

Verwandte Themen