Duende IdentityServer中Worker服务认证授权最佳实践咨询
场景适配方案与最佳实践
你这个是典型的无用户参与的服务对服务(M2M)调用场景,直接用OAuth2标准定义的客户端凭证流(Client Credentials Flow) 即可,Duende IdentityServer对这个流程有完整原生支持,完全匹配你要的调用方识别、最小权限管控需求,不需要额外自研鉴权逻辑。
核心认证流程配置
1. IdP(Duende IdentityServer)侧配置
- 为Worker服务单独创建专属客户端,不要和其他前端、用户端客户端复用配置:
- 授权类型固定设置为
GrantTypes.ClientCredentials,不要开启其他授权类型(比如授权码流、密码流),避免被滥用。 - 配置高强度客户端密钥,密钥存储时做SHA256哈希,不要存明文,同时配置密钥过期时间支持定期轮换。
- 严格遵循最小权限原则,仅给这个客户端分配Worker需要调用的API对应的Scope,多余Scope一律不分配,从token签发源头就限制可访问的API范围。
- 授权类型固定设置为
- 配置客户端声明规则:
- 客户端凭证流签发的token默认会携带
client_id声明,值就是你给Worker分配的客户端ID,这个就是全局唯一的调用方标识,和用户场景下的sub声明作用完全一致;默认该流程下sub声明值也会和client_id保持一致,如果你需要明确区分用户调用和服务调用,可以额外配置让IdP给M2M token加上acr声明,值固定为client,方便SP侧识别。 - 如果需要区分同一个Worker服务的不同部署实例,可以给每个实例分配独立的ClientId,或者在客户端配置里添加自定义声明(比如
service_instance_id),token签发时会自动携带。
- 客户端凭证流签发的token默认会携带
2. SP(受保护API)侧配置
你现有的基于claims的用户认证、权限校验逻辑不需要大改,Duende的AccessToken校验中间件天然兼容用户token和M2M客户端token:
- 认证配置保持现有JWT校验逻辑即可,不需要单独为服务调用搭一套认证体系。
- 调用方识别逻辑:接口处理请求时,先判断token的
acr声明是否为client,如果是就直接取client_id(或sub)的值作为调用方唯一标识,和普通用户的身份标识做区分即可,日志审计、权限判断都可以直接用这个值。 - 权限管控分两层落地,避免单点失效:
- 第一层是Scope级粗粒度管控:在对应API接口/控制器上添加Scope校验特性,只允许携带对应Scope的token访问,没有对应Scope的请求直接返回403。因为IdP侧只给Worker分配了必要的Scope,Worker就算持有有效密钥,也拿不到其他API的访问权限,从根本上防止越权访问未授权接口。
- 第二层是操作级细粒度管控:如果同一Scope下还需要限制Worker的可执行操作(比如只允许查询不允许删除、只允许访问特定租户的数据),直接复用你现有的claims权限校验逻辑即可,判断当前调用方的
client_id、自定义声明是否满足操作要求,和你之前做用户权限判断的逻辑完全一致。
落地注意事项
- M2M场景的AccessToken有效期不要设置过长,建议根据调用频率设置为1~24小时,降低token泄露后的风险。
- 不要为了省事给Worker客户端分配全量API Scope,后续新增API时默认不要给Worker加权限,按需申请单独分配,始终保持最小权限。
- 不要自研API密钥、签名校验逻辑,原生客户端凭证流已经覆盖了防篡改、防重放、密钥轮换、声明传递的全部能力,自研反而容易出安全漏洞。
- 如果你之前搜不到适配示例,大概率是关键词偏差,这个场景是Duende IdentityServer最基础的落地场景之一,所有官方实现逻辑都是围绕标准OAuth2 M2M规范设计的,没有特殊定制逻辑。
内容的提问来源于stack exchange,提问作者Navid_pdp11
相关产品推荐
相关产品推荐

