.NET Core 3.0 中 AspNetUserToken 和自定义 JWT 令牌之间的区别
Differences between AspNetUserToken and custom made JWT token in .NET Core 3.0
我正在做一个小的副项目 API,我想实现 JWT 身份验证。我已经使用 JWT 做了一些 API,并且总是进行自定义实现和验证。
这一次,我想使用 Identity/Entity 框架 来更快地使用已经为我准备的工具。
在执行 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
方法内部使用,如 GenerateChangeEmailTokenAsync
、GenerateChangePhoneNumberTokenAsync
等。 REF
为了使用更抽象GenerateUserTokenAsync
,您必须提供一个实际生成令牌的令牌提供者。由于您没有任何用于 JWT 访问令牌的默认令牌提供程序,您仍然必须自己编写逻辑并注册您的自定义令牌提供程序,然后您可以使用 GenerateUserTokenAsync
方法。
您仍然需要自己编写 JWT 逻辑,包括声明等,但会增加开销。
我正在做一个小的副项目 API,我想实现 JWT 身份验证。我已经使用 JWT 做了一些 API,并且总是进行自定义实现和验证。
这一次,我想使用 Identity/Entity 框架 来更快地使用已经为我准备的工具。
在执行 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
方法内部使用,如 GenerateChangeEmailTokenAsync
、GenerateChangePhoneNumberTokenAsync
等。 REF
为了使用更抽象GenerateUserTokenAsync
,您必须提供一个实际生成令牌的令牌提供者。由于您没有任何用于 JWT 访问令牌的默认令牌提供程序,您仍然必须自己编写逻辑并注册您的自定义令牌提供程序,然后您可以使用 GenerateUserTokenAsync
方法。
您仍然需要自己编写 JWT 逻辑,包括声明等,但会增加开销。