2016-09-14 1 views
0

diesen Code in meinem Web-API Betrachten 2 Owin Middleware:Authentifizieren mit RSA JWT auf Owin

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var config = new HttpConfiguration(); 
     ConfigureAuthentication(app); 
     app.UseCors(CorsOptions.AllowAll); 
     WebApiConfig.Register(config); 
     app.UseWebApi(config); 
     config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;  
    } 

    private static void ConfigureAuthentication(IAppBuilder app) 
    { 
     var issuer = "<<MyIssuer>>"; 
     var audience = "<<MyAudience>>"; 

     const string publicKeyBase64 = "<<MyPublicKeyBase64>>"; 

     var certificate = new X509Certificate2(Convert.FromBase64String(publicKeyBase64)); 

     app.UseJwtBearerAuthentication(
      new JwtBearerAuthenticationOptions 
      { 
       AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active, 
       AllowedAudiences = new[] { audience }, 
       IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[] 
       { 
        new X509CertificateSecurityTokenProvider(issuer, certificate), 
       } 
      } 
     ); 
    } 
} 

Ich kann eine Bearer-Token von meinem IDP bekommen und testen Sie es mit folgendem Ergebnis in jwt.io:

Verified token

Issuer Übereinstimmungen vom Code zum verifizierten Token.

ClientId Übereinstimmungen vom Code zum verifizierten Token (sub).

Audience Übereinstimmungen vom Code zum verifizierten Token.

Aus irgendeinem Grund - der Token ist jedoch abgelehnt (401 nicht autorisiert) auf jede Anfrage und ich kann einfach nicht verstehen, warum. Meine Anfrage enthält den Header Authorization mit dem gleichen Bearer-Token, das ich mit jwt.io (Bearer ey..) überprüfen kann. Wenn es einen Unterschied macht, verwende ich Auth0. Ich kann auch erwähnen, dass ich versucht habe, das öffentliche Zertifikat herunterzuladen und die Datei zu verwenden, anstatt einfach die öffentliche Schlüsselzeichenfolge mit dem gleichen Ergebnis zu verwenden.

+0

Ihre Anmeldeinformationen werden in Ihrem Bild nicht vollständig verschleiert; Es ist möglich, den Schlüssel zu lesen, wenn jemand so geneigt ist. Ich würde vorschlagen, diese Token zu widerrufen, wenn sie noch im Umlauf sind, falls Sie es nicht schon getan haben. – Rob

+0

Das war eigentlich nur ein Beispielprojekt und die Schlüssel sind schon lange abgelaufen, aber trotzdem, danke für die Sorge;) – Marcus

Antwort

1

Einstellung TokenValidationParameters Eigenschaft der JwtBearerAuthenticationOptions Instanz die Frage geholfen:

private static void ConfigureAuthentication(IAppBuilder app) 
{ 
    var issuer = "<<MyIssuer>>"; 
    var audience = "<<MyAudience>>"; 

    const string publicKeyBase64 = "<<MyPublicKeyBase64>>"; 

    var certificate = new X509Certificate2(Convert.FromBase64String(publicKeyBase64)); 

    app.UseJwtBearerAuthentication(
     new JwtBearerAuthenticationOptions 
     { 
      AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active, 
      AllowedAudiences = new[] { audience }, 
      IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[] 
      { 
       new X509CertificateSecurityTokenProvider(issuer, certificate), 
      }, 
      TokenValidationParameters = new TokenValidationParameters 
      { 
       IssuerSigningKeyResolver = (a, b, c, d) => new X509SecurityKey(certificate), 
       ValidAudience = audience, 
       ValidIssuer = issuer 
      }   
     } 
    ); 
}