Azure CLI创建带Microsoft Graph权限的SP时管理员同意失败排查
问题根源
你脚本中的权限ID查询逻辑和实际分配的权限类型不匹配:
- 你写的
getPermissionId函数查询的是oauth2Permissions属性,这是委托权限的ID存储位置 - 你调用
az ad app permission add时指定的是=Role标记,代表要分配应用权限,这类权限的ID存储在appRoles属性下,二者ID完全不互通,因此传入的ID在Microsoft Graph资源的应用权限列表中不存在,触发报错。
另外你脚本中的az ad app permission grant是给委托权限授予同意的命令,分配应用权限不需要执行这一步,多余的调用反而可能导致冲突。
修正后的完整脚本
#!/bin/bash ## Usage: ./setup-sp.sh <app-name> set -eou pipefail getPermissionId () { # $1 = 应用权限名称,例如 User.ReadWrite.All az ad sp list \ --query "[?appDisplayName=='Microsoft Graph'].appRoles[?value=='$1'].id" \ --all \ --output tsv } APP_NAME=$1 echo "获取订阅ID" SUBSCRIPTION_ID=$(az account show --query id --output tsv) echo "订阅ID为: $SUBSCRIPTION_ID" echo "创建应用注册和关联的服务主体" SP=$(az ad sp create-for-rbac --role Contributor --name $APP_NAME --scopes /subscriptions/$SUBSCRIPTION_ID) echo "以下是你的服务主体凭证,请妥善存储!" echo $SP APP_ID=$(echo $SP | jq -r .appId) echo "应用ID为: $APP_ID" # Microsoft Graph API 固定ID API_ID="00000003-0000-0000-c000-000000000000" # 获取各类应用权限的ID echo "正在获取API权限ID" USER_READWRITE_ALL_ID=$(getPermissionId User.ReadWrite.All) GROUP_READWRITE_ALL_ID=$(getPermissionId Group.ReadWrite.All) APPLICATION_READWRITE_ALL_ID=$(getPermissionId Application.ReadWrite.All) # 给服务主体添加权限 echo "正在添加API权限到服务主体" az ad app permission add \ --id $APP_ID \ --api $API_ID \ --api-permissions \ $USER_READWRITE_ALL_ID=Role \ $GROUP_READWRITE_ALL_ID=Role \ $APPLICATION_READWRITE_ALL_ID=Role # 等待权限配置同步,避免后续同意失败 sleep 2 echo "正在为API权限授予管理员同意" az ad app permission admin-consent --id $APP_ID echo "操作完成。你可以在Azure门户中查看你的服务主体配置"
注意事项
- 运行脚本的账号需要持有全局管理员、应用管理员或者云应用管理员角色,才有权限给应用权限授予管理员同意
- 如果运行失败,可以先删除已经创建的同名应用注册,再重试脚本,避免残留配置导致冲突
- 如果你实际需要分配的是委托权限,请将
getPermissionId的查询属性改回oauth2Permissions,同时将权限配置中的=Role改为=Scope,再恢复原来的az ad app permission grant调用即可。
内容的提问来源于stack exchange,提问作者errorline1
相关产品推荐
相关产品推荐

