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

OpenIddict客户端凭证模式下Token无受众导致API认证失败的配置排查与解决方案咨询

问题分析与解决方案

从你的错误日志可以明确看出,认证失败的核心原因是Client Credentials模式生成的Token中没有包含目标API资源的受众(aud)声明,OpenIddict的验证组件因为找不到aud字段,直接拒绝了请求。

错误排查方向

你的配置主要有两处关键缺失:

  1. 客户端权限未关联目标资源:你的nj-client客户端仅配置了获取Token的基础权限,但没有声明它可以访问signal_system_web_resource这个API资源,导致授权服务器生成Token时不会添加对应的aud声明。
  2. Scope未与客户端权限绑定:虽然你定义了signal.system.web Scope并关联了资源,但客户端没有被授予访问该Scope的权限,即便请求时带了Scope,也不会生成包含目标资源的Token。

正确配置步骤

1. 更新客户端授权配置(nj-client)

修改客户端注册代码,添加对目标资源或对应Scope的访问权限:

if (await manager.FindByClientIdAsync("nj-client") == null)
{
    await manager.CreateAsync(new OpenIddictApplicationDescriptor
    {
        ClientId = "nj-client",
        ClientSecret = "C4BBED05-A7C1-4759-99B5-0F84A29F0E08",
        DisplayName = "Ninja Client Application",
        Permissions =
        {
            Permissions.Endpoints.Token,
            Permissions.GrantTypes.ClientCredentials,
            // 方式1:直接授权客户端访问目标资源(无需Scope)
            Permissions.Prefixes.Resource + "signal_system_web_resource",
            // 方式2:授权客户端访问关联资源的Scope(需在Token请求时指定scope参数)
            // Permissions.Prefixes.Scope + "signal.system.web"
        }
    });
}

2. 调整Token请求参数(如果使用Scope方式)

如果选择用Scope授权,客户端在请求Token时,需要额外传递scope参数:

POST /connect/token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials&client_id=nj-client&client_secret=C4BBED05-A7C1-4759-99B5-0F84A29F0E08&scope=signal.system.web

3. 确认资源服务器配置正确性

你的资源服务器配置已经正确指定了允许的受众和Introspection验证方式,这部分无需修改:

services.AddOpenIddict()
    .AddValidation(options =>
    {
        options.SetIssuer("https://localhost:44301/");
        options.AddAudiences("signal_system_web_resource");
        options.UseIntrospection()
            .SetClientId("signal_system_web_resource")
            .SetClientSecret("846B62D0-DEF9-4215-A99D-86E6B8DAB342");
        options.UseSystemNetHttp();
        options.UseAspNetCore();
    });

Client Credentials模式保护API的完整流程总结

  1. 授权服务器端:
    • 注册保密客户端,指定ClientCredentials授权类型、Token端点权限
    • 为客户端分配可访问的API资源或关联Scope的权限
    • 注册API资源和对应的Scope(可选,用于更细粒度的权限控制)
  2. 客户端端:
    • 向授权服务器的Token端点发送请求,携带client_id、client_secret和grant_type=client_credentials(可选scope)
    • 获取包含aud声明的Token
  3. 资源服务器端:
    • 配置OpenIddict Validation,指定授权服务器地址、允许的受众
    • 使用Introspection模式验证Token(保密场景下推荐)
    • 在需要保护的API控制器/方法上添加[Authorize]标记

内容的提问来源于stack exchange,提问作者Rasik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 19:18:15