52 votes

ASP.NET Core 2.0 JWT la Validation échoue avec " échec de l'Autorisation pour l'utilisateur: (null) erreur

Je suis à l'aide d'ASP.NET Core 2.0 application (API Web) comme un JWT émetteur pour générer un jeton de consommables grâce à une application mobile. Malheureusement, cette marque ne pouvait pas être validé par un contrôleur tout en peuvent être validées par un autre (en utilisant le même processus de validation de la configuration au sein de la même asp.net core 2.0 app).

J'ai donc un jeton qui est valide et peut être décodé, a toutes les revendications et les horodatages. Mais d'un point de terminaison accepte, tandis que l'autre me donne une erreur 401 et la sortie de débogage:

Microsoft.AspNetCore.D'autorisation.DefaultAuthorizationService:Information: Échec de l'autorisation pour l'utilisateur: (null).

[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
      Authorization failed for user: (null).
Microsoft.AspNetCore.Authorization.DefaultAuthorizationService:Information: Authorization failed for user: (null).
[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[3]
      Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'.
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'.
Microsoft.AspNetCore.Mvc.ChallengeResult:Information: Executing ChallengeResult with authentication schemes ().
[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Mvc.ChallengeResult[1]
      Executing ChallengeResult with authentication schemes ().
[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler[12]
      AuthenticationScheme: Bearer was challenged.
Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler:Information: AuthenticationScheme: Bearer was challenged.
[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      Executed action MyController.Get (WebApi) in 72.105ms
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action MyController.Get (WebApi) in 72.105ms
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 271.077ms 401 
[40m[32minfo[39m[22m[49m: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      Request finished in 271.077ms 401 

Ma validation de l'installation ci-dessous:

var secretKey = Configuration["Authentication:OAuth:IssuerSigningKey"];
var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secretKey));
var tokenValidationParameters = new TokenValidationParameters
{
   ValidateIssuerSigningKey = true,
   IssuerSigningKey = signingKey,
   ValidateIssuer = true,
   ValidIssuer = Configuration["Authentication:OAuth:Issuer"],
   ValidateAudience = true,
   ValidAudience = Configuration["Authentication:OAuth:Audience"],
   ValidateLifetime = true,
   ClockSkew = TimeSpan.Zero,
};

services.AddAuthentication(options =>
{
   options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
   options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
   options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
    options.RequireHttpsMetadata = false;
    options.TokenValidationParameters = tokenValidationParameters;
});

Ces deux extrémités sont identiques, juste vivre dans les différents contrôleurs, à la fois marqué avec l' Authorize d'attribut.

Comment est-ce possible?

123voto

Ole Lindstad Points 886

La séquence de l'ajouter dans la configuration de la fonction d'importance. Assurez-vous que

app.UseAuthentication();

vient avant

app.UseMvc();

Cela peut-il avoir été le problème?

14voto

Kevin Points 549

Dans votre démarrage.cs ConfigureServices méthode si vous ajoutez

services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            }).AddJwtBearer(options => ...

Explication: Lorsque vous utilisez [Autoriser] sur un contrôleur, il se lie à la première du système d'autorisation par défaut.

options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;

Avec cela, vous êtes paramètre par défaut pour JWT Porteur d'authentification.

en outre, vous pouvez ajouter

options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;

cette ligne est de savoir comment éviter de contracter le 404 non trouvé des erreurs lors de l'utilisation de l'Identité de JWTs. Si vous êtes à l'aide de l'identité de la DefaultChallengeScheme vais essayer de vous rediriger vers une page de connexion, qui, si inexistant, aura pour résultat l'obtention d'un 404 not found plutôt que le voulait 401 non autorisé. en définissant la DefaultChallengeScheme à JwtBearerDefaults.AuthenticationScheme non autorisées de ne plus essayer de vous rediriger vers une page de connexion

Si vous utilisez l'Authentification par Cookie avec JWT l'authentification dans le [Autoriser] balise, vous pouvez spécifier ce que authenticationScheme vous le souhaitez. par exemple

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

8voto

spottedmahn Points 4439

J'ai ajouté:

app.UseAuthentication();

En Startup.Configure() et qui a résolu cette erreur pour moi.

Référence: Auth 2.0 Migration annonce

2voto

user1508188 Points 39

essayez ceci dans le démarrage.cs

services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        }).AddJwtBearer(opts => ...

2voto

Jon B Points 36

Cela semble être le comportement que vous recevrez lors de votre JWT n'est pas correctement validé. J'ai eu ce problème comme un résultat de taper "au Porteur: (JWT)" au lieu de "Porteur (JWT)" dans l'en-tête

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X