Azure AD中如何获取Access Token的aud声明客户端ID并生成OBO令牌?
问题解决:Azure AD OBO流程令牌生成失败及Aud声明异常
核心问题原因
你当前的授权码请求仅使用email openid offline_access这类OpenID Connect身份范围,并未指定针对客户端或目标API的资源范围,导致返回的Access Token的aud声明指向默认的Microsoft Graph服务,而非你的客户端ID或目标API的App ID URI,这直接导致OBO流程调用失败。
分步解决方案
1. 修正授权码请求的Scope
在授权码端点请求中,添加客户端自身的默认范围或目标API的默认范围,确保返回的Access Token的aud符合OBO断言要求:
示例1:请求客户端自身范围(Aud为客户端ID)
https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/authorize?client_id=sample_client_id&response_type=code&redirect_uri=http://localhost/login/oauth2/code/azure&response_mode=query&scope=sample_client_id/.default email openid offline_access
其中sample_client_id/.default表示请求客户端应用的默认委派权限,生成的Access Token的aud会是你的客户端ID。
示例2:直接请求目标API范围(Aud为API的App ID URI)
https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/authorize?client_id=sample_client_id&response_type=code&redirect_uri=http://localhost/login/oauth2/code/azure&response_mode=query&scope={app-id-uri}/.default email openid offline_access
这里{app-id-uri}替换为你Web API的App ID URI,生成的Access Token的aud会是该API的标识。
2. 验证Access Token的Aud声明
拿到新的Access Token后,可通过jwt.ms解析确认aud字段是否为预期的客户端ID或API的App ID URI。
3. 确保OBO流程的配置正确性
- 确认Web客户端应用已被Web API授予委派权限:在Azure AD的API应用“权限”面板中添加客户端应用的权限,并完成管理员同意。
- 确认API应用的应用清单中
knownClientApplications字段已添加客户端应用的ID。 - 确保MSAL代码中的
authority为单租户模式的正确地址:https://login.microsoftonline.com/{tenant-id}/v2.0
修正后的MSAL Java代码
ConfidentialClientApplication clientApp = ConfidentialClientApplication .builder(clientId, ClientCredentialFactory.createFromSecret(clientSecret)) .authority("https://login.microsoftonline.com/{tenant-id}/v2.0") .build(); Set<String> scopes = new HashSet<>(); // 替换为你的Web API的App ID URI scopes.add(appIdUri + "/.default"); UserAssertion assertion = new UserAssertion(accessToken); OnBehalfOfParameters params = OnBehalfOfParameters.builder(scopes, assertion).build(); CompletableFuture<IAuthenticationResult> result = clientApp.acquireToken(params); String userInfoAccessToken = result.get().accessToken();
常见错误排查
- 若OBO请求返回
invalid_grant/invalid_request:检查断言Token的aud是否正确,客户端是否已获得API的权限,以及scope参数是否符合要求。 - 若Token的
aud仍不符合预期:确认授权码请求的scope中是否包含了正确的资源标识符(客户端ID或API的App ID URI)。
内容的提问来源于stack exchange,提问作者AMIT VISHWAKARMA
相关产品推荐
相关产品推荐

