You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:36:05