web-dev-qa-db-fra.com

Erreur Asp.net Core 2 - 401 avec un jeton au porteur

Je ne peux pas accéder à la méthode protégée avec Authorized avec un jeton généré par Asp.net Core.

La configuration:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(cfg =>
            {
                cfg.RequireHttpsMetadata = false;
                cfg.SaveToken = true;
                cfg.Audience = Configuration["Tokens:Issuer"];
                cfg.ClaimsIssuer = Configuration["Tokens:Issuer"];
                cfg.TokenValidationParameters = new TokenValidationParameters()
                {
                    ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,
                    ValidIssuer = Configuration["Tokens:Issuer"],
                    ValidAudience = Configuration["Tokens:Issuer"],
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"]))
                };

Le jeton généré:

var claims = new[] {
                new Claim (JwtRegisteredClaimNames.Sub, model.Email),
                new Claim (JwtRegisteredClaimNames.Jti, Guid.NewGuid ().ToString()),
            };

            //_config
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Tokens:Key"]));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            var expiration = DateTime.UtcNow.AddDays(7);
            var token = new JwtSecurityToken(_config["Tokens:Issuer"],
                _config["Tokens:Issuer"],
                claims,
                expires: expiration,
                signingCredentials: creds);

            return new TokenModel()
            {
                Token = new JwtSecurityTokenHandler().WriteToken(token),
                Expiration = expiration,
                UserFirstName = model.FirstName,
                UserLastName = model.LastName
            };

Après la génération, j'obtiens ce genre de jeton:

{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ0ZWl4ZWlyYXBlcnNvQGdtYWlsLmNvbSIsImp0aSI6IjVmNTk3OGVkLWRlZjAtNDM3Yi1hOThhLTg3ZWU4YTQ3MmZlNCIsImV4cCI6MTUxODg2ODYxOCwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo1MDAwIn0.1fHXr8jtuZ8PTJmJPBKQIqiOk_c-bCQ6KRyFLLJkU5s",
    "expiration": "2018-02-17T11:56:58.683076Z",
    "userFirstName": null,
    "userLastName": null
}

Je peux ajouter ou non l'autorisation dans mes en-têtes HTTP dans Postman, je reçois un "Exception non autorisée - 401"

Je vérifie déjà un autre Stack post et GitHub Post, il semble que mon la configuration c'est ok.

Si nécessaire, je peux ajouter le fichier de configuration.

Merci.

Modifier 1:

Voici l'écran de l'en-tête en facteur:

enter image description here

12
OrcusZ

Je ne sais pas si vous rencontrez le même problème, mais j'exécute un projet ASP.NET Core avec un code similaire au vôtre.

J'ai rencontré des réponses 401 Lors de l'inclusion d'un jeton porteur fourni par la connexion de l'API, mais cela a été corrigé en appelant app.UseAuthentication() comme méthode first dans Configure(). Mon code a changé depuis ...

app.UseMvc();
app.UseAuthentication();

Pour ça...

app.UseAuthentication();
app.UseMvc();
27
phantomraa

Votre code semble OK. La cause racine la plus possible du problème est que vous n'avez pas ajouté de middleware d'authentification à votre application. AddAuthentication l'appel d'extension pour IServiceCollection enregistre simplement tous les services requis, mais il n'ajoute pas de middleware d'authentification au pipeline de requêtes HTTP.

Pour résoudre le problème, ajoutez l'appel suivant dans la méthode Startup.Configure():

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseAuthentication();

    // ...
}

J'ai pu reproduire le problème avec votre code et appeler app.UseAuthentication() résout le problème.

5
CodeFuller