成功登录后,我有一个jwt,并希望从该令牌中获取数据(令牌已编码,包含使用Claims保存的信息(。有没有一种方法可以使用HttpContext从承载令牌中获取数据。AuthenticateAsync(JwtBearerDefaults.AuthenticationScheme(?我不知道如何从收到的令牌中获取数据。这是我的密码。
public async Task<TokenResponse> Login(string username, string password)
{
var user = await dataContext.Users
.FirstOrDefaultAsync(x => x.Username == username && x.Password == password.Encrypt())
?? throw new BadRequestExceptions("Wrong username or password");
var claims = new[]
{
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
new Claim(ClaimTypes.Role, user.Role.ToString()),
new Claim(ClaimTypes.GivenName,user.Name),
new Claim(ClaimTypes.Upn, user.Username)
};
var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(tokenConfig.Key));
var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256);
var tokenString = new JwtSecurityToken(tokenConfig.Issuer, tokenConfig.Audience, claims: claims, signingCredentials: signingCredentials);
tokenResponse = new TokenResponse()
{
Token = new JwtSecurityTokenHandler().WriteToken(tokenString)
};
return tokenResponse;
}
从令牌中获取数据的最佳方法(前提是您有多个数据要检索(是扩展(扩展方法(ClaimsPrincipal,然后您可以从程序集中的任何位置调用在该类中扩展的任何方法。在下面找到一个示例:
public static class ClaimsPrincipalExtensions
{
public static string GetUsername(this ClaimsPrincipal user)
{
return user.FindFirst(ClaimTypes.Name)?.Value;
}
public static int GetUserId(this ClaimsPrincipal user)
{
return int.Parse(user.FindFirst(ClaimTypes.NameIdentifier)?.Value);
}
}
然后,在控制器操作的某个位置,您可以调用User。GetUsername((和用户。GetUserId((
然而,如果您只需要检索一个或两个记录,那么这就足够了:
int userId = int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value)
编码快乐!!!