IdentityServer实现资源所有者密码授权时JWT未插入iat声明问题
问题排查方案
1. 检查IdentityServer全局配置
确认你在注册IdentityServer服务时,没有显式关闭EmitIssuedAtClaim配置,该配置默认值为true,如果被设为false会全局禁用iat声明的生成:
builder.Services.AddIdentityServer(options => { // 确保没有这行配置,或者值设为true options.EmitIssuedAtClaim = true; })
2. 检查自定义IProfileService实现
如果你自己实现了IProfileService接口来注入自定义用户声明,请确认在GetProfileDataAsync方法中,没有过滤IdentityServer要求返回的内置声明:
- 方法执行时先查看
context.RequestedClaimTypes集合,确认包含iat - 不要只返回你自己构造的自定义声明列表,需要将IdentityServer要求的内置声明也加入到
context.IssuedClaims中
3. 检查声明过滤配置
检查你项目中是否有全局或者针对Client/ApiResource的声明过滤规则:
- 确认Client配置中没有添加
iat到ClaimTypesToExclude排除列表 - 确认ApiResource配置中没有显式设置
Claims属性限制返回的声明类型,你当前贴出的ApiResource配置未限制,该点可以排除
4. 确认token解析逻辑没有问题
System.IdentityModel.Tokens.Jwt库默认开启了Claim类型映射,会将标准的iat声明映射为http://schemas.microsoft.com/ws/2008/06/identity/claims/issuedat,导致你直接读取ClaimTypes.IssuedAt之外的key时看不到对应值,可以通过关闭默认映射避免该问题:
// 在服务注册阶段执行,清除默认的Claim类型映射 JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear();
你可以先将生成的原始token复制到JWT解析工具中直接查看payload,确认iat字段是否真的不存在,排除解析逻辑导致的误判。
内容的提问来源于stack exchange,提问作者Suraj
相关产品推荐
相关产品推荐

