无已登录用户时Azure AD应用委托权限使用问题咨询
1. 是否存在无需已登录用户即可使用委托权限访问API的方案
不存在符合Azure AD官方身份规范的这类方案。
委托权限的核心设计目标是允许应用代表某个具体的已认证用户访问资源,签发的访问令牌必须同时包含应用服务主体、用户主体两类身份声明。没有已登录用户的身份上下文时,Azure AD无法生成携带用户声明的合法访问令牌,自然无法承载委托权限的校验逻辑。
部分场景下有人会通过硬编码用户账号密码走ROPC(资源所有者密码凭据)流实现“无交互调用”,但本质上还是使用了一个真实存在的用户身份完成认证,不属于“无需已登录用户”的范畴,且该流本身不支持MFA、条件访问等管控能力,微软已明确不推荐在生产环境使用。
2. Azure AD权限体系中“已登录用户”的准确定义
这里的“已登录用户”特指:在访问令牌签发环节,通过Azure AD认证流程完成身份校验,其用户对象ID、租户ID、用户主体名等身份标识被写入访问令牌对应声明的用户主体。
判定当前调用场景是否存在已登录用户,唯一标准是所持有的访问令牌是否携带合法的用户身份声明:
- 若令牌包含
scp(委托权限范围)声明、用户对象ID(用户级oid)、upn/unique_name等用户属性,即存在已登录用户上下文 - 若令牌仅包含应用服务主体的
oid、roles(应用权限)声明,无任何用户身份相关声明,即不存在已登录用户上下文
注意:本地浏览器留存了Azure门户登录态、本地系统缓存了某个用户的凭据,都不代表当前API调用场景存在已登录用户,必须以调用API时传入的访问令牌内容为准。
3. 执行Connect-AzureAD命令登录Azure AD时,当前操作身份是否属于已登录用户范畴
分场景判定:
- 默认执行
Connect-AzureAD走交互式登录、或者指定用户账号密码登录的场景,属于已登录用户范畴。这个流程本质是Azure AD PowerShell模块作为公共客户端应用,引导用户完成Azure AD身份认证,最终拿到的访问令牌同时携带Azure AD PowerShell的服务主体身份、登录用户的身份,完全符合已登录用户的判定标准。 - 如果执行命令时携带
-ServicePrincipal参数,通过客户端ID+客户端密钥/证书的方式登录,拿到的令牌仅包含服务主体身份,没有任何用户身份声明,不属于已登录用户范畴。
4. 配置委托权限后调用API返回403,切换为应用权限即可正常调用的原因
两类权限的运行逻辑、校验规则完全不同,403本质是委托权限场景下未通过API侧的双层校验,具体逻辑如下:
委托权限的双层校验逻辑
委托权限的访问需要通过两层校验,任意一层不通过都会返回403:
- 令牌签发层校验:需要租户管理员/用户本身为应用授予对应委托权限,且完成权限同意流程,Azure AD才会在签发的访问令牌中写入对应的
scp声明。如果未授予权限、未完成同意,令牌本身不携带对应权限,调用自然被拦截。 - API资源侧校验:这是绝大多数403问题的根源——委托权限仅代表“应用有权代表用户尝试执行对应操作”,不代表“操作一定会被允许”。API拿到带用户身份的令牌后,除了校验
scp声明是否匹配,还会独立校验令牌中携带的用户主体本身,是否拥有执行目标操作的权限。
举个最常见的例子:就算给应用配置了Microsoft Graph的User.ReadWrite.All委托权限,如果登录用的是租户内普通用户,而目录角色权限限制普通用户无法修改其他用户的属性,API校验用户权限时发现用户本身无操作权限,就会直接返回403。
应用权限的单层校验逻辑
应用权限是直接授予给应用服务主体本身的权限,不需要绑定任何用户身份,校验逻辑只有一层:只要租户管理员为服务主体授予了对应应用权限,Azure AD签发的令牌携带对应的roles声明,API就会认可服务主体拥有全租户范围的对应操作权限,不会再额外绑定单个用户的权限限制,只要权限配置正确即可正常调用。
常见的委托权限场景403触发原因还包括:需要管理员同意的权限未完成租户级管理员同意、调用API时传入了其他资源的访问令牌、条件访问策略拦截了当前用户的访问请求等。
内容的提问来源于stack exchange,提问作者Kattiri Venkataratnam

