Si cela intéresse quelqu'un, cela a marché pour moi. J'ai une identité personnalisée qui utilise int pour une clé primaire, donc j'ai remplacé la méthode GetUserAsync.
Surcharge de GetUserAsync
public override Task<User> GetUserAsync(ClaimsPrincipal principal)
{
var userId = GetUserId(principal);
return FindByNameAsync(userId);
}
Obtenir l'identité de l'utilisateur
var user = await _userManager.GetUserAsync(User);
Si vous utilisez une clé primaire Guid ordinaire, vous n'avez pas besoin de remplacer GetUserAsync. Tout ceci suppose que votre jeton est configuré correctement.
public async Task<string> GenerateTokenAsync(string email)
{
var user = await _userManager.FindByEmailAsync(email);
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(_tokenProviderOptions.SecretKey);
var userRoles = await _userManager.GetRolesAsync(user);
var roles = userRoles.Select(o => new Claim(ClaimTypes.Role, o));
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, user.UserName),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim(JwtRegisteredClaimNames.Iat, DateTime.UtcNow.ToString(CultureInfo.CurrentCulture)),
new Claim(JwtRegisteredClaimNames.GivenName, user.FirstName),
new Claim(JwtRegisteredClaimNames.FamilyName, user.LastName),
new Claim(JwtRegisteredClaimNames.Email, user.Email),
}
.Union(roles);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.UtcNow.AddHours(_tokenProviderOptions.Expires),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
return Task.FromResult(new JwtSecurityTokenHandler().WriteToken(token)).Result;
}
0 votes
Quelle est votre question exactement ?
0 votes
Vous n'avez besoin que de l'identité ? J'ai modifié ma réponse pour ajouter comment l'obtenir en utilisant la méthode plus sophistiquée _userManager.GetUserId(User).
0 votes
Oui, principalement j'ai besoin de l'Id de la table AspNetUsers, ou de la session. currentUser.FindFirst(ClaimTypes.NameIdentifier).Value donne l'Id en utilisant Claims. Cela fonctionne aussi avec UserManager ! Merci Gerardo ! Est-ce qu'une méthode est plus efficace que l'autre ?
0 votes
UserManager effectue en interne .FindFirst(ClaimTypes.NameIdentifier). Les performances sont donc les mêmes. Je préfère l'encapsulation du UserManager pour la facilité de lecture. D'un autre côté
.GetUserAsync()
est plus lent parce qu'il va vers la BD.0 votes
Je suis tout à fait d'accord, Gerardo. Je vous remercie.