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 的类?