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

Azure应用注册权限疑问:App2未授权却能获取App1令牌?

问题分析:App2无需权限即可获取App1令牌,请求App3却失败的原因

核心差异总结

App1与App3的关键区别在于是否定义了自定义应用角色(App Roles),结合Azure AD v2端点的权限校验逻辑,导致了两种截然不同的结果:


1. 为什么App2能成功获取App1的令牌?

你使用的是client_credentials应用级授权流,请求范围为api://client-id-of-app1/.default,这个范围的作用是:

  • 代表客户端应用(App2)请求API应用(App1)的所有已分配应用权限
  • 但如果API应用(App1)未定义任何自定义应用角色,Azure AD v2端点会放宽校验:只要客户端请求的API标识符合法,就会颁发一个不包含roles声明的令牌——因为此时没有需要分配的角色,系统默认允许生成针对该API的令牌(尽管令牌无具体权限)。

另外,App1的accessTokenAcceptedVersion: 2配置(v2版本应用)也会影响这个行为:v2端点对无自定义角色的API应用,在client_credentials流下不会强制要求权限分配。

注意:App1自身拥有的MS Graph权限(如Application.ReadWrite.OwnedBy)是App1作为客户端调用Graph API的权限,和App2调用App1作为API的权限属于完全独立的体系,两者没有关联。


2. 为什么请求App3时返回AADSTS501051错误?

错误AADSTS501051的核心含义是:App2未被分配到App3的任何应用角色。这说明:

  • App3作为API应用,已经定义了至少一个自定义应用角色(通常在Manifest的appRoles字段中配置)
  • 对于有自定义角色的API应用,使用client_credentials流请求/.default范围时,Azure AD会强制校验:客户端应用必须被分配该API的至少一个应用角色,否则拒绝颁发令牌。

解决这个问题需要给App2分配App3的应用角色:

  • 进入Azure门户的App3应用注册页面,或直接在App2的应用注册页面中,添加App3的应用权限并完成管理员同意(即完成角色分配)

补充说明

  • client_credentials是应用级授权流,与用户级的Delegated权限无关,所以App2配置的User.Read Delegated权限不会影响该流程的结果。
  • /.default是v2端点的特殊范围,会自动映射到客户端已被分配的该API的所有应用权限,无需显式指定具体权限名称。

内容的提问来源于stack exchange,提问作者Container-Man

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 14:55:04