2016-07-15 27 views
8

Ich versuche, die JWT Bearer-Authentifizierung in meinem AspNetCore MVC app (Web-API nur) mit dem JwtBearerMiddleware aber bin immer eine 401 Antwort mit Kopf zu implementieren:UseJwtBearerAuthentication Unterzeichnung Schlüssel

WWW-Authenticate: Bearer error="invalid_token", error_description="The signature key was not found" 

Der entsprechende Code in Startup CS- sieht wie folgt aus:

app.UseJwtBearerAuthentication(new JwtBearerOptions 
{ 
    Authority = "https://example.okta.com", 
    Audience = "myClientId" 
}); 

Mit der URL Authority ich die Middleware meines Identity Provider-Metadaten abfragen aus https://example.okta.com/.well-known/openid-configuration die jwks_uri zu erhalten erwarten würde, um dann den Signaturschlüssel von 012.354 zu erhalten. Ich glaube nicht, dass das passiert. Was muss ich tun, um die Signaturschlüssel zu finden und zu verwenden? Dank

+0

Können Sie Ausnahmedetails posten (Protokoll aktivieren und Fehlerprotokolle anzeigen)? –

+0

@ademcaglin Ich habe Probleme, zu diesen Details zu gelangen, da alles in einer nugget-Bibliothek passiert. Und ich kann nirgendwo einen Haltepunkt sehen. – Steve

Antwort

9

Nach Referenzen folgenden und Graben in die AspNet Security repo (speziell die JwtBearerHandler und JwtBearerMiddleware Klassen), die führte mich zum Microsoft.IdentityModel Namespace, die die ConfigurationManager<T> Klasse in einer Azure Extensions repo (erste, dann auf die OpenIdConnectConfigurationRetriever Klasse (GetAsync Methode), dann auf die JsonWebKeySet.GetSigningKeys() Methode), entdeckte ich schließlich, dass die JWtBearerMiddleware tatsächlich die Schlüssel aus der jwks_uri in den Metadaten erhält. Puh.

Also warum funktionierte es nicht? Was soll ich früher geprüft habe, ist, dass die Kind in der Kopfzeile des Bearer JWT hat in der Tat auch nicht das Kindes ‚s aus den jwks_uri Übereinstimmen, daher wurde es nicht gefunden. Es war der access_code, den ich als Bearer Token gesendet habe. Das id_token auf der anderen Seite hat eine Kid, die passt, so dass mit der stattdessen es funktionierte!

ich da gelesen habe:

Die OIDC Zugriffstoken gilt nur für die Okta /oauth2/v1/userinfo Endpunkt und damit als undurchsichtig durch der Anwendung behandelt werden sollten. Die Anwendung muss sie nicht validieren, da sie nicht für andere Ressourcenserver verwendet werden soll. Das Format davon und der Schlüssel, der verwendet wird, um es zu signieren, können ohne vorherige Mitteilung geändert werden. source

... so kann ich nicht das Zugriffstoken verwenden.

+0

Hilfreich, ..danke – Coding4Fun