2016-07-21 6 views
1

Mit ASP.NET Core 1.0 (rtm), mit dem etwas minimal verifiable sample, das ich produziert habe, sehe ich, dass die von mir erzeugten JSON Web Tokens nicht sind Leiten der .net Kern json Web-Token Middleware Anspruch Herausforderung, und mit diesem Fehler fehlschlagen:UseJwtBearerAuthentication schlägt mit IDX10504 fehl: Signatur kann nicht geprüft werden, Token hat keine Signatur

Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException: 
IDX10504: Unable to validate signature, token does not have a signature: 
'... ... token value here...' 

ich eine minimale Probe produziert habe, die in ASP.NET Core-RC1 fein gearbeitet, die aber in RTM nicht funktioniert . Ich habe nicht nach RC2 portiert, um zu testen, aber ich glaube, dass ein solcher Test sinnlos ist. Sie können die Demo mit einem bereitgestellten Testskript ausüben:

python tests\testloginapi.py 
    GET OK: 200 http://localhost:54993/authorize/login?username=TEST&pas... 
    POST OK: 200 http://localhost:54993/authorize/login?username=TEST&pas... 
    authorization token received... eyJhbGciOi... 
    expected status 200 but got 401 for GET http://localhost:54993/authorizetest/test 

Auffallende Punkte meiner minimal Beispiel sind:

Startup.cs Methode Configure hat:

 app.UseJwtBearerAuthentication(_keyArtifacts.getJwtBearerOptions()); 

Die Inhaber Optionen sind wie folgt :

public static JwtBearerOptions CreateJwtBearerOption(RsaSecurityKey key, string tokenIssuer, string tokenAudience) 
     { 
      var jwtBearerOptions = new JwtBearerOptions(); 


      jwtBearerOptions.AutomaticAuthenticate = true; 
      jwtBearerOptions.AutomaticChallenge = true; 
      jwtBearerOptions.TokenValidationParameters.ValidateIssuerSigningKey = true; 
      jwtBearerOptions.TokenValidationParameters.IssuerSigningKey = key; 
      jwtBearerOptions.TokenValidationParameters.ValidIssuer = tokenIssuer; 
      jwtBearerOptions.TokenValidationParameters.ValidateIssuer = true; 
      jwtBearerOptions.TokenValidationParameters.ValidateLifetime = true; 
      jwtBearerOptions.TokenValidationParameters.ClockSkew = TimeSpan.Zero; 



      jwtBearerOptions.TokenValidationParameters.ValidAudience = tokenAudience; 
      return jwtBearerOptions; 
     } 

Diese Frage wirklich darauf an:

  1. In Asp.net Core 1.0 RTM, was sind die minimalen Schritte zum Erstellen eines Token, das die Middleware-Herausforderung bestehen wird?

  2. Fehle ich einfach einen einfachen Schritt (so wenig wie eine Zeile Code vielleicht), die diese Demo funktionieren würde, einschließlich "signieren" Arbeit haben?

  3. Angesichts der demo ist immer noch ein schreckliches Stück Code, und niemand sollte es jemals in der Produktion verwenden (weil ich mich schon schäme), meine Hoffnung ist diese Frage kann noch aufschlussreich sein, wie zu machen das UseJwtBearerAuthentication System funktioniert tatsächlich, zumindest bei einer Demo-Skala.

+0

nützliche Info: https://stormpath.com/blog/token-authentication-asp-net-core –

Antwort

3

In Asp.net core 1.0 rtm, what are the minimal steps to create a token that will pass the middleware challenge? Am I simply missing some simple step (as little as one line of code perhaps) that would make this demo work, including having "signing" work?

IdentityModel (die Bibliothek verantwortlich für die Token von der JWT Inhabermiddleware erhalten Validierung) ist nicht in der Lage Ihre JWT Token zu validieren, weil sie nicht effektiv jede Unterschrift hat, wie in dem Fehler Sie‘erklärt re sehen.

Die fehlende Signatur wird durch die Tatsache, dass Sie nicht wahrscheinlich verursacht SecurityTokenDescriptor.SigningCredentials zuweisen, wenn Sie Ihre eigenen Token zu erstellen:

dass
JwtSecurityTokenHandler handler = BearerOptions 
    .SecurityTokenValidators 
    .OfType<JwtSecurityTokenHandler>() 
    .First(); 

var tokenData = new SecurityTokenDescriptor 
{ 

    Issuer = BearerOptions.TokenValidationParameters.ValidIssuer, 
    Audience = BearerOptions.TokenValidationParameters.ValidAudience, 
    Subject = new ClaimsIdentity(claims), 
    Expires = DateTime.Now.AddDays(1), 
    NotBefore = DateTime.Now 
}; 

/*JwtSecurityToken*/ 
var securityToken = 
    handler.CreateToken 
    (
     tokenData 
    ); 

Fix, und es sollte funktionieren.

Given that the demo is still a horrible piece of code, and nobody should ever use it in production (because I'm already ashamed of it), my hope is this question can still be illuminating as to how to make the UseJwtBearerAuthentication system actually work, at least at a demo scale.

Eigentlich ist das Problem nicht, wie Sie die JWT Inhabermiddleware verwenden, aber wie Sie Ihre eigenen Token generieren. Die Implementierung einer eigenen Token-Issuer-Soße ist in Ordnung, aber die Verwendung eines Standards wie OAuth2 oder OpenID Connect ist im Allgemeinen besser und einfacher zu benutzen (zB wenn Sie einen OIDC-Server haben, müssen Sie die JWT-Träger-Middleware nicht konfigurieren Signieren von Schlüsseln mit OIDC discovery).

Fühlen Sie sich frei, dieses andere SO answer für weitere Informationen zu lesen.

+0

Ich glaube, ich habe bereits ein SigningCredentials-Objekt.Vielleicht bin ich sehr nah dran. –

+0

Sie injizieren 'SigningCredentials' bereits als Konstruktorparameter, warum nicht einfach fließen lassen? – Pinpoint

+0

Sie rocken Sir. Bitte akzeptiere mein geringes Lob und meine Anbetung. –

Verwandte Themen