web-dev-qa-db-fra.com

Comment obtenir un utilisateur actuel dans l'API Web .NET Core (de JWT Token)

Après beaucoup de difficultés (et beaucoup de tutoriels, guides, etc.), j'ai réussi à configurer une petite API Web .NET Core REST avec un contrôleur Auth émettant des jetons JWT lorsque le nom d'utilisateur et le mot de passe stockés sont valides.

Le jeton stocke l'ID utilisateur en tant que sous-revendication.

J'ai également réussi à configurer l'API Web pour valider ces jetons lorsqu'une méthode utilise l'annotation Authorize.

  app.UseJwtBearerAuthentication (...)

Maintenant ma question: Comment lire l'ID utilisateur (stocké dans la revendication de sujet) dans mes contrôleurs (dans une API Web)?

Il s’agit essentiellement de cette question ( Comment obtenir un utilisateur actuel dans ASP .NET Core ), mais j’ai besoin d’une réponse pour une API Web. Et je n'ai pas de UserManager. Je dois donc lire la revendication en question quelque part.

16
monty

Vous pouvez utiliser cette méthode:

var email = User.FindFirst("sub")?.Value;

Dans mon cas, j'utilise l'e-mail comme une valeur unique

11
Ateik

La réponse acceptée n'a pas fonctionné pour moi. Je ne sais pas si cela est dû à mon utilisation de .NET Core 2.0 ou à autre chose, mais il semble que le cadre mappe la revendication Subject à une revendication NameIdentifier. Donc, ce qui suit a fonctionné pour moi:

string userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;

Notez que cela suppose que la revendication Subject sub est définie dans le fichier JWT et que sa valeur correspond à l'ID de l'utilisateur.

Par défaut, le gestionnaire d'authentification JWT dans .NET mappera la sous-revendication d'un jeton d'accès JWT au type de revendication System.Security.Claims.ClaimTypes.NameIdentifier. [La source]

Il existe également un fil de discussion sur GitHub où ils concluent que ce comportement est source de confusion.

15
Honza Kalfus

Si vous utilisez Name pour stocker la ID ici:

var tokenDescriptor = new SecurityTokenDescriptor
{
    Subject = new ClaimsIdentity(new Claim[]
                {
                    new Claim(ClaimTypes.Name, user.Id.ToString())
                }),
    Expires = DateTime.UtcNow.AddDays(7),
    SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};

Dans chaque méthode de contrôleur, vous pouvez télécharger l'ID de l'utilisateur actuel en:

var claimsIdentity = this.User.Identity as ClaimsIdentity;
var userId = claimsIdentity.FindFirst(ClaimTypes.Name)?.Value;
1
ImpoUserC

vous pouvez le faire en utilisant.

User.Identity.Name

0
Imamul Karim Tonmoy