web-dev-qa-db-fra.com

Obtenez les revendications JWT directement à partir du jeton, ASP Net Core 2.1

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:

  1. J'ai accès au jeton.
  2. Je ne suis pas situé dans une classe Controller et la demande ne passe pas par [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:

Solution

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

6
G.Dimov

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;
1
Victor Trusov