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 Réponses :
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' });
@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
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
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.
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();
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?