AspNetUserToken和.NET Core 3.0中定制的JWT令牌之间的差异



我正在开发一个小型的侧面项目API,我想实现JWT身份验证。我已经用JWT制作了一些API,并且总是定制实现和验证。

这一次,我想使用身份/实体框架来更快地使用已经为我制作的工具。

在执行GenerateToken方法并浏览互联网时,我注意到许多由IdentityFramework创建的表都没有使用。我对AspNetUserToken产生了兴趣。

我注意到不是

private object GenerateToken(IdentityUser user)
{
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.UTF8.GetBytes(ApiConfig.JwtSecretKey);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Name, user.UserName),
new Claim(ClaimTypes.Email, user.Email),
}),
Expires = DateTime.UtcNow.AddSeconds(double.Parse(ApiConfig.JwtExp)), //TODO: Try parse
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature),
Audience = ApiConfig.JwtAudience,
Issuer = ApiConfig.JwtIssuer
};
var token = tokenHandler.CreateToken(tokenDescriptor);

return tokenHandler.WriteToken(token);
}

我用来生成一个新的JWT代币,添加声明、发行人、受众等……可能会被这个取代:

//Removes existing token
_userManager.RemoveAuthenticationTokenAsync(user, "lboard", "login"); 
//Creates a new one
var newToken = await _userManager.GenerateUserTokenAsync(user, "lboard", "login");
//Set the new token for the user 
await _userManager.SetAuthenticationTokenAsync(user, "lboard", "login", newToken);

我想知道这两种方法之间有什么区别,使用自定义实现是否有任何好处,或者使用IdentityFramework是否更好。

GenerateUserTokenAsync方法由其他UserManager方法内部使用,如GenerateChangeEmailTokenAsyncGenerateChangePhoneNumberTokenAsync等。REF

为了使用更抽象的GenerateUserTokenAsync,必须提供一个实际生成令牌的令牌提供程序。由于JWT访问令牌没有任何默认的令牌提供程序,因此您仍然需要自己编写逻辑并注册自定义令牌提供程序才能使用GenerateUserTokenAsync方法。

您仍然需要自己编写JWT逻辑、include声明等,但会增加开销。

最新更新