JwtSecurityTokenHandler 返回小写声明类型

Posted

技术标签:

【中文标题】JwtSecurityTokenHandler 返回小写声明类型【英文标题】:JwtSecurityTokenHandler returns lower case claim type 【发布时间】:2018-09-09 12:37:38 【问题描述】:

我正在使用 Auth0 和 JWT 对我的应用程序实施身份验证。我的所有声明名称都是大写格式,但是一旦 JwtSecurityTokenHandler 将我的令牌转换为 JwtSecurityToken,所有声明类型都是 JwtSecurityToken 提供小写类型。

声明和构建令牌

private string BuildToken(UserModel user)
    
        var claims = new[] 
            new Claim(JwtRegisteredClaimNames.Sub, user.Name),
            new Claim(JwtRegisteredClaimNames.Email, user.Email),
            new Claim(JwtRegisteredClaimNames.Birthdate, user.Birthdate.ToString("yyyy-MM-dd")),
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
        ;

        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

        var token = new JwtSecurityToken(_config["Jwt:Issuer"],
          _config["Jwt:Issuer"],
          claims,
          expires: DateTime.Now.AddMinutes(30),
          signingCredentials: creds);

        return new JwtSecurityTokenHandler().WriteToken(token);
    

JwtSecurityTokenHandler

var handler = new JwtSecurityTokenHandler();
var tokenS = handler.ReadToken(context.HttpContext.Request.Headers["Authorization"]) as JwtSecurityToken;
var jti = tokenS.Claims.First(claim => claim.Type == "Sub").Value;  //here Sub is giving exception, but if i change it to lower case sub, working fine.

【问题讨论】:

【参考方案1】:

JWT 区分大小写。 sub claim 被定义为小写。

JwtRegisteredClaimNames.Sub 不得让您认为存在名为Sub 的声明。这只是您使用的库中的一个名称,而不是在 JWT 中编码的声明名称。

sub 正确,Sub 未定义。

【讨论】:

以上是关于JwtSecurityTokenHandler 返回小写声明类型的主要内容,如果未能解决你的问题,请参考以下文章

JWTSecurityTokenHandler.ValidateToken() 啥时候真正有效?

JwtSecurityTokenHandler().WriteToken(token) 在托管环境中抛出错误

JwtSecurityTokenHandler 和 TokenValidationParameters

JwtSecurityTokenHandler.ValidateToken 抛出 Lifetime 验证失败异常

JwtSecurityTokenHandler().ValidateToken() :: 签名验证失败...在此上下文中不支持 sha256

为啥我们有两个用于 JWT 令牌 JwtSecurityTokenHandler 和 JsonWebTokenHandler 的类?