多Azure应用共用同一JWT令牌实现跨API身份认证方案咨询
同一Azure租户内跨API令牌互通实现方案
针对同一Azure AD租户下、关联独立应用注册的两个RestAPI,实现用API1生成的令牌访问API2的需求,以下是几种可行方案:
方案1:共享自定义Scope实现令牌直接互通
这是最直接的用户上下文令牌互通方案,适合用户直接持令牌访问两个API的场景:
- 在API2的Azure AD应用注册中,暴露自定义API Scope(例如
api://<API2应用ID>/user_access),设置允许的访问者为租户内用户。 - 在API1的Azure AD应用注册中,添加API权限,选择API2刚创建的自定义Scope,完成管理员同意(企业租户下需管理员操作,确保所有用户可使用该权限)。
- 用户请求API1的access_token时,在scope参数中同时包含API1自身的Scope和API2的自定义Scope(例如
api://<API1应用ID>/access api://<API2应用ID>/user_access)。 - API2的认证逻辑需验证令牌中的
aud(受众)是否包含自身应用ID,或scp(权限)声明是否包含自定义Scope,验证通过则允许访问。
方案2:On-Behalf-Of(OBO)令牌交换
适合API1作为中间层,需要代表用户调用API2的场景(无需用户重新登录):
- 在API2的Azure AD应用注册中暴露自定义Scope,并在API1的应用注册中添加该Scope的权限并完成管理员同意。
- API1收到用户的access_token后,向Azure AD令牌端点发送请求,使用OBO flow申请API2的专属access_token:
POST /{tenant-id}/oauth2/v2.0/token HTTP/1.1 Host: login.microsoftonline.com Content-Type: application/x-www-form-urlencoded grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer client_id=<API1应用ID> client_secret=<API1应用密钥> assertion=<用户的API1 access_token> scope=api://<API2应用ID>/user_access requested_token_use=on_behalf_of - API1使用返回的API2专属access_token调用API2,API2验证该令牌的
aud和scp声明即可。
方案3:应用角色(App Roles)跨授权
适合粗粒度权限控制的场景,例如按用户组分配跨API的访问角色:
- 在API2的Azure AD应用注册中定义应用角色(例如
API_User、API_Admin),指定可分配的对象为租户内用户/组。 - 将目标用户或组分配到API2的应用角色中。
- 在API1的Azure AD应用注册中,添加API2的应用角色权限并完成管理员同意。
- 用户通过API1获取的令牌会包含
roles声明,API2验证该声明中是否包含允许的角色即可。
方案对比与选择
- 若需用户直接持同一令牌访问两个API:优先选方案1,配置简单,符合用户直观使用习惯。
- 若API1需作为中间层代理用户请求:优先选方案2,令牌更安全(API2的令牌仅用于API2),符合OAuth2最佳实践。
- 若需基于角色的跨API权限管控:选方案3,适合企业级权限分级场景。
关键验证要点
- 确保所有应用注册处于同一Azure AD租户,权限申请需完成管理员同意(避免用户逐个授权)。
- API的认证逻辑建议使用Microsoft Identity Web等官方库,自动处理令牌验证、受众检查、权限声明解析,减少自定义逻辑的安全风险。
内容的提问来源于stack exchange,提问作者Moh-Spark
相关产品推荐
相关产品推荐

