2
votes

401 Non autorisé: Authentification WWW: Porteur

J'ai vu des fils similaires à ce problème, mais je n'ai pas eu de chance de le résoudre. La connexion a fonctionné avec succès mais lorsque j'essaie d'obtenir les données de l'utilisateur connecté dans ma page d'accueil, je reçois cette erreur 401 Non autorisé, le même erroe est également affiché dans Postman

My startup.cs

  [HttpPost]
        [Route("Login")]
        //POST : /api/ApplicationUser/Login
        public async Task<IActionResult> Login(LoginModel model)
        {
            var user = await _userManager.FindByNameAsync(model.UserName);
            if (user != null && await _userManager.CheckPasswordAsync(user, model.Password))
            {
                var tokenDescriptor = new SecurityTokenDescriptor
                {
                    Subject = new ClaimsIdentity(new Claim[]
                    {
                        new Claim("UserID",user.Id.ToString())
                    }),
                    Expires = DateTime.UtcNow.AddDays(1),
                    SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_appSettings.JWT_Secret)), SecurityAlgorithms.HmacSha256Signature)
                };
                var tokenHandler = new JwtSecurityTokenHandler();
                var securityToken = tokenHandler.CreateToken(tokenDescriptor);
                var token = tokenHandler.WriteToken(securityToken);
                return Ok(new { token });
            }
            else
                return BadRequest(new { message = "Username or password is incorrect." });
        }
    }


3 commentaires

Je vois que vos en-têtes n'ont pas de jeton de porteur!


@TanvirArjel dans mon startup.cs ??? J'ai autorisé anyHeaders et dans Postman, il montre le jeton dans les en-têtes et dans mon getUserProfile getUserProfile () {var tokenHeader = new HttpHeaders ({'Authorization': 'Bearer' + localStorage.getItem ('token'), 'Content- Tapez ':' application / json '}); return this.http.get (this.BaseUrl + '/ UserProfile', {headers: tokenHeader}); }


utilisez-vous réellement asp.net mvc ou asp.net core mvc?


3 Réponses :


1
votes

Un problème que je vois est ici:

var tokenHeader = new HttpHeaders({ 'Authorization': 'Bearer ' + localStorage.getItem('token'), 'Content-Type': 'application/json' });
// ---------------------------------------------------------^ Notice I've added a space here.

Lorsque vous spécifiez un jeton Bearer , vous devez laisser un espace entre Bearer et le jeton lui-même, de sorte que le résultat ressemble à ceci a >:

Authorization: Bearertoken

Dans votre cas, cela se traduirait par:

Authorization: Bearer token

Cependant, si vous regardez le code ci-dessus , vous verrez que vous allez réellement le fournir comme ceci:

Authorization: <type> <credentials>

qui ne fonctionnera pas. Par conséquent, changez votre code en:

var tokenHeader = new HttpHeaders({ 'Authorization': 'Bearer' + localStorage.getItem('token'), 'Content-Type': 'application/json' });


2 commentaires

@SouhaKhemiri Avez-vous vérifié que le jeton a réellement une valeur ou non?


oui il a je peux le voir jeter le facteur ou l'inspecteur dans la section application je peux voir mon jeton



18
votes

Dans mon cas, je n'obtenais pas d'erreur et tout semblait fonctionner mais mon API renvoyait 401 à chaque fois. Je me suis beaucoup cogné la tête à ce sujet. J'avais ...

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

sur mon contrôleur et j'ai trouvé que le site essayait d'utiliser l'authentification par cookie, donc bien que mon JWT fonctionnait bien, l'absence d'authentification de cookie l'a fait échouer. J'ai changé l'attribut en ...

[Authorize]

et cela a résolu le problème car maintenant le contrôleur ignore l'authentification des cookies et se concentre uniquement sur jwt. J'espère que cela aide quelqu'un


3 commentaires

Super comme. C'est le problème auquel j'ai été confronté et vous m'avez donné le bon chemin. Gloire.


Pour éviter de définir des AuthenticationSchemes à chaque fois, ajoutez-le au démarrage. services.AddAuthentication (options => {options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;}) pas services.AddAuthentication (JwtBearerDefaults.AuthenticationS‌ cheme) , ce dernier n'a pas fonctionné pour moi.


Pour moi, ajouter app.UseAuthentication () a fait l'affaire.



1
votes

J'ai trouvé que changer l'ordre des instructions était mon problème. Configure () nécessite que le middleware ASP.NET Core soit dans le bon ordre.

Cela n'a PAS fonctionné et m'a obligé à ajouter [Authorize (AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)] à chaque contrôleur. ..

app.UseAuthentication();
app.UseAuthorization();

Cela fonctionne:

app.UseAuthorization();
app.UseAuthentication();


0 commentaires