.NET 6升级到.NET 8后出现IDX12723与IDX11020 JWT解析错误求助
解决.NET 6升级到.NET 8后的JWT解析错误
错误原因
升级后触发的IDX11020异常明确说明:JWT payload中的iat字段是字符串类型,但JWT标准要求该字段必须为数字格式的Unix时间戳。.NET 8版本的JwtSecurityTokenHandler对标准遵循更严格,而.NET 6的解析逻辑允许兼容字符串形式的数字,这是报错的核心原因。
解决步骤
1. 确认问题细节(可选但推荐)
开启PII显示,查看完整的token payload,验证iat字段的具体格式:
// 在Program.cs的服务配置代码前添加 IdentityModelEventSource.ShowPII = true;
运行后即可看到未隐藏的payload内容,确认iat是否为字符串类型。
2. 根据token生成方选择解决方案
情况1:token由自身系统生成
检查JWT生成代码,确保iat字段被设置为数字类型:
// 正确示例:使用Unix时间戳数字 var claims = new List<Claim> { new Claim(JwtRegisteredClaimNames.Iat, DateTimeOffset.UtcNow.ToUnixTimeSeconds().ToString(), ClaimValueTypes.Integer64) }; // 或者通过TokenDescriptor设置IssuedAt var tokenDescriptor = new SecurityTokenDescriptor { IssuedAt = DateTime.UtcNow, // 其他配置项... };
避免将iat值转为普通字符串,必须确保其类型为数字(或声明为Integer64类型)。
情况2:token由第三方系统生成(无法修改生成逻辑)
自定义JsonConverter兼容字符串类型的iat,并配置到JwtSecurityTokenHandler中:
首先创建转换器:
public class NumericStringConverter : JsonConverter<long> { public override long Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { // 若为字符串则尝试转为long,否则直接读取数字 if (reader.TokenType == JsonTokenType.String && long.TryParse(reader.GetString(), out long value)) { return value; } return reader.GetInt64(); } public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options) { writer.WriteNumberValue(value); } }
然后修改解析代码:
var token = filterContext.HttpContext.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ")[1]; var tokenHandler = new JwtSecurityTokenHandler(); // 添加自定义转换器 tokenHandler.JsonSerializerOptions.Converters.Add(new NumericStringConverter()); var authToken = tokenHandler.ReadToken(token) as JwtSecurityToken;
此配置可让解析器自动将字符串类型的iat转为数字,兼容第三方生成的非严格标准token。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

