代码之家  ›  专栏  ›  技术社区  ›  Antoine Thiry Esther L

中AspNetUserToken和自定义JWT令牌之间的差异。NET核心3.0

  •  0
  • Antoine Thiry Esther L  · 技术社区  · 4 年前

    我正在做一个小型的副项目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实现。

    0 回复  |  直到 4 年前
        1
  •  3
  •   MultiValidation Ashish Mahalle    4 年前

    这个 GenerateUserTokenAsync 方法由其他内部使用 UserManager 方法如 GenerateChangeEmailTokenAsync , GenerateChangePhoneNumberTokenAsync 等等。 REF

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

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