使用服务主体为用户分配应用角色时权限不足问题排查
问题解决:服务主体调用Graph API分配应用角色权限不足问题
需求与API实现
开发脚本为指定用户添加应用角色,可通过以下Graph API的HTTP请求实现:
curl --silent -X POST -H 'Content-Type: application/json' \ -H "Authorization: Bearer ${TOKEN}" \ -d "{\"appRoleId\":\"${AIRLOCK_MANAGER_ROLE_ID}\",\"principalId\":\"${AIRLOCK_MANAGER_USER}\",\"resourceId\":\"${WORKSPACE_APP_REG}\"}" \ https://graph.microsoft.com/v1.0/servicePrincipals/${WORKSPACE_APP_REG}/appRoleAssignments
测试环境验证
使用启用Privileged Role Administrator权限的个人租户账号,通过以下步骤可正常执行分配:
- 执行
az login完成登录 - 调用
az account get-access-token --resource-type ms-graph获取token - 携带该token执行上述POST请求,成功为用户分配应用角色
生产环境问题
生产环境需改用目标应用角色对应的服务主体操作:
- 已创建服务主体密钥,通过以下命令登录并获取token:
az login --service-principal --allow-no-subscriptions --tenant "${TENANT_ID}" --username "${CLIENT_ID}" --password "${CLIENT_SECRET}"
- 该服务主体可正常调用
https://graph.microsoft.com/v1.0/users/${AIRLOCK_MANAGER_USER}/appRoleAssignments查询用户已分配的角色,但执行POST分配应用角色的请求时,提示权限不足。 - 已按官方文档尝试为服务主体分配
Application.Read.All和AppRoleAssignment.ReadWrite.All权限(均为Application类型且已授予管理员同意),每次修改后等待约20分钟,问题仍存在。
排查与解决
最终定位到两个核心问题:
- 问题1:在为服务主体分配权限之前就已获取了token,旧token不包含新分配的权限
- 问题2:需确保分配的
Application.Read.All和AppRoleAssignment.ReadWrite.All是Application类型权限(而非Delegated类型)
修正操作:
- 确认服务主体已正确配置上述Application类型权限并完成管理员同意
- 重新执行登录命令获取新的token
- 使用新token执行POST请求,成功完成应用角色分配
内容的提问来源于stack exchange,提问作者phanxen
相关产品推荐
相关产品推荐

