c# - .NET Core 3.0 中 AspNetUserToken 和自定义 JWT token 之间的差异

标签 c# asp.net-core authentication jwt asp.net-core-identity

我正在开发一个小型副项目 API,我想实现 JWT 身份验证。我已经使用 JWT 制作了一些 API,并且总是进行自定义实现和验证。

这一次,我想使用身份/ Entity Framework 来加快速度并使用已经为我制作的工具。

在执行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 token ,添加声明、发行者、受众等...可能会被替换为:

//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,您必须提供实际生成 token 的 token 提供程序。由于您没有 JWT 访问 token 的任何默认 token 提供程序,因此您仍然需要自己编写逻辑并注册自定义 token 提供程序,然后可以使用 GenerateUserTokenAsync 方法。

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

关于c# - .NET Core 3.0 中 AspNetUserToken 和自定义 JWT token 之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63966516/

相关文章:

ios - Firebase 将垃圾记录到控制台。 Xcode - 8 (Swift3)

java - Spring MVC Controller 中的授权方法

c# - 如何实现返回类型为 Task<T> 的方法

c# - 在 C# 中读取文本文件

c# - 我应该在删除之前检查用户是否存在吗?

validation - 在 asp.net core razorpage 中禁用特定按钮的按钮验证

android - 在 NTAG213 中获取异常

c# - 路由到 Controller

c# - X509Certificate 构造函数需要 >6 秒才能为特定用户执行

asp.net - ASP.NET CORE 中的 Request.Files