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

使用spring-cloud-azure-starter-active-directory集成AAD时遇AADSTS28004错误

解决AADSTS28004:Scope数量超限问题

核心原因

Azure AD对单次请求中携带的scope数量存在限制,新增webApi-4后,请求的总scope数超出了允许的上限,触发了AADSTS28004错误。

可行解决方案

1. 合并API权限(推荐)

若4个API属于同一Azure AD应用注册下的资源,可将它们的权限scope合并为一个宽泛的统一权限,比如把api://xxx/webApi-1/access、api://xxx/webApi-2/access等合并为api://xxx/all-webapis/access,之后在每个API服务中验证这个合并后的scope即可。

2. 分批次获取令牌

避免单次请求同时携带所有4个API的scope,改为按需分批次获取:

  • 首次请求获取webApi-1、webApi-2、webApi-3的访问令牌
  • 当需要调用webApi-4时,单独请求该API的scope以获取专属令牌
    在Spring Cloud Azure中,可通过OAuth2AuthorizedClientManager针对不同API分别构建令牌请求。

3. 改用应用权限(业务场景允许时)

如果Web应用是后台服务,无需用户上下文,可切换为应用权限(Application Permissions)。这种模式通过客户端凭据流获取令牌,无需携带用户相关scope,从根源上规避scope数量限制。

4. 清理冗余scope

检查YAML配置,删除重复或未使用的scope,示例如下:

spring:
  cloud:
    azure:
      active-directory:
        client:
          scopes:
            - api://webApi-1/access
            - api://webApi-2/access
            - api://webApi-3/access
            - api://webApi-4/access

确保每个scope唯一且必要,减少总数量。

分批次获取令牌代码示例

单独获取webApi-4令牌的实现:

@Autowired
private OAuth2AuthorizedClientManager authorizedClientManager;

public String getWebApi4Token() {
    OAuth2AuthorizeRequest request = OAuth2AuthorizeRequest.withClientRegistrationId("azure")
            .principal(SecurityContextHolder.getContext().getAuthentication())
            .scopes(Set.of("api://webApi-4/access"))
            .build();
    OAuth2AuthorizedClient client = authorizedClientManager.authorize(request);
    return client.getAccessToken().getTokenValue();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 18:14:52