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

为何Identity Server中password与authorization code授权获取的token声明不一致

问题解答

关于两种授权模式claims不一致的性质

这属于预期内的正常表现,核心原因是两种授权模式的认证流程逻辑存在差异:

  • 授权码(Authorization Code)模式属于交互式认证流程,Identity Server 会完整读取身份资源、API资源对应的scope配置,同时会补充交互式认证专属的claims(比如auth_time标识认证时间、amr标识认证方式),最终生成的token会包含所有当前scope允许返回的claims
  • 密码(Password/ROPC)模式属于非交互式直接认证,默认实现仅会写入用户核心身份字段(比如sub、用户名),不会主动加载所有关联的自定义业务claims,也不会生成交互式流程专属的claims

密码模式补充claims的方案

如果需要让密码模式返回的业务类claims和授权码模式保持一致,通过自定义Profile Service实现是官方推荐的标准方案,实现注意事项如下:

  • 实现IProfileService接口,重写GetProfileDataAsync方法,在方法内统一编写用户claims加载逻辑,不管是密码模式还是授权码模式的请求,都按照相同的规则读取用户关联的角色、业务字段等信息写入claims集合
  • 逻辑中要增加scope校验,仅返回当前请求scope对应的claims,避免返回多余的敏感字段
  • 服务注册时需要添加配置启用自定义Profile Service,示例注册代码:
// 以Duende IdentityServer为例,IdentityServer4配置逻辑一致
builder.Services.AddIdentityServer()
    .AddProfileService<CustomProfileService>()
    // 其他原有配置
    ;

注意:auth_time、amr这类交互式认证专属的claims不属于业务类claims,密码模式下无需强行补充,缺少这类字段属于正常情况。


内容的提问来源于stack exchange,提问作者Alberto López

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:42:01