Je travaille sur un ASP API Web Net Core 2.1. J'ai correctement implémenté JWT dans mon projet. Tout avec l'autorisation fonctionne bien.
Normalement, lorsque j'ai besoin de réclamations d'utilisateurs, je sais que je peux les obtenir comme ceci (par exemple, réclamation par e-mail):
var claimsIdentity = User.Identity as ClaimsIdentity;
var emailClaim = claimsIdentity.Claims.FirstOrDefault(x => x.Type == ClaimTypes.Email);
Le fait est que je ne suis pas dans un contrôleur qui hérite de la classe ControllerBase
, donc je n'ai pas d'objet User
ou [Authorize]
les attributs.
Ce que j'ai cependant, c'est le jeton lui-même.
par exemple.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImFkbWluIiwiZW1haWwiOiJhZG1pbiIsIm5iZiI6MTU2ODYzNjYxMywiZXhwIjoxNTY4NjQ3NDEzLCJpYXQiOjE1Njg2MzY2MTN9.ED9x_AOvkLQqutb09yh3Huyv0ygHp_i3Eli8WG2S9N4
Je souhaite obtenir les revendications directement à partir du jeton, car:
[Authorize]
attributs, donc IHttpContextAccessor
ne peut pas être utilisé également.Comment puis-je y parvenir dans ASP Net Core 2.1? Au cas où quelqu'un voudrait voir comment j'ajoute les revendications de l'utilisateur:
var tokenDescriptor = new SecurityTokenDescriptor
{
Expires = DateTime.UtcNow.AddHours(3),
Subject = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, email),
new Claim(ClaimTypes.Email, email)
}),
SigningCredentials = new SigningCredentials(key: new SymmetricSecurityKey(key), algorithm: SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
Je suis situé dans une classe qui dérive de IDocumentFilter
(classe Swagger)
éditer:
Ces lignes ont fait l'affaire pour moi. token
variable est une chaîne et représente le toke lui-même.
var handler = new JwtSecurityTokenHandler();
var jwtToken = handler.ReadToken(token) as JwtSecurityToken;
var email = jwtToken.Claims.First(claim => claim.Type == "email").Value;
Merci
Par exemple, dans mon projet actuel, je reçois des réclamations par validation. Son jeton de rafraîchissement, donc je ne peux pas utiliser l'attribut [Authorize].
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
public ClaimsPrincipal ValidateRefreshToken(string refreshToken)
{
try
{
var validationParams = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(tokenSecurityKey),
ValidateLifetime = true
};
return new JwtSecurityTokenHandler().ValidateToken
(
refreshToken,
validationParams,
out SecurityToken token
);
}
catch (Exception e)
{
Log.Error(e.Message);
return null;
}
}
puis
var claims = ValidateRefreshToken(refreshToken);
...
var userIdString = claims.Claims.FirstOrDefault(x => x.Type == "userId")?.Value;