我已经手动创建了2个不同的azure应用程序注册。据我所见,他们是一样的。
然而,当我尝试使用它们以编程方式运行将Azure角色分配给托管ID的powershell脚本时,一个有效,另一个失败。
具体来说,我想添加3个角色:
Azure门户主页->MyResourceGroup->MyManagedId->Azure角色分配。
角色包括:
-
存储表数据贡献者
-
Azure服务总线数据所有者
-
存储队列数据参与者
从我所看到的应用程序注册情况来看:
-
两者都是订阅级别的所有者。(订阅->访问控制(IAM))
-
两人都创造了新的秘密
-
两者都具有“API权限”部分列出的这些权限:
|
权限名称
|
类型
|
需要管理员同意
|
|
Application.ReadWrite.OwnedBy
|
应用
|
对
|
|
AppRoleAssignment.ReadWrite.All
|
应用
|
对
|
|
User.Read
|
委派
|
不
|
当我尝试运行分配角色的脚本时,应用程序reg 1会起作用。我最终得到了我需要的存储帐户角色。当我使用应用程序reg 2时,它会失败,并出现以下错误:
{
"status": "Failed",
"error": {
"code": "DeploymentFailed",
"message": "At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.",
"details": [{
"code": "BadRequest",
"message": "{\r\n \"error\": {\r\n \"code\": \"InvalidPrincipalId\",\r\n \"message\": \"A valid principal ID must be provided for role assignment.\"\r\n }\r\n}"
}, {
"code": "BadRequest",
"message": "{\r\n \"error\": {\r\n \"code\": \"InvalidPrincipalId\",\r\n \"message\": \"A valid principal ID must be provided for role assignment.\"\r\n }\r\n}"
这是剧本:
#Load Environment variables that drive this script.
$currentEnv = (Get-Content './vars.json' | Out-String | ConvertFrom-Json)
az cache purge
az login `
--service-principal `
--username $currentEnv.AZ_DEPLOYMENT_CLIENT_ID `
--password $currentEnv.AZ_DEPLOYMENT_CLIENT_SECRET `
--tenant $currentEnv.AZ_TENANT_ID `
--allow-no-subscriptions
#set the subscription we want to use
az account `
set --subscription $currentEnv.AZ_SUBSCRIPTION_ID
az resource list `
-g $currentEnv.AZ_RESOURCE_GROUP_NAME `
-o table
#look up the app function name for this resource group
$AZ_FUNCTION_APP = az functionapp list `
-g $currentEnv.AZ_RESOURCE_GROUP_NAME `
-o json | ConvertFrom-Json
Write-output $AZ_FUNCTION_APP.Name
$MANAGED_ID_DISPLAY_NAME = $AZ_FUNCTION_APP.Name + "-userId"
Write-output $MANAGED_ID_DISPLAY_NAME + " is the name of the managed identity"
$objectid=$(az ad sp list --display-name $MANAGED_ID_DISPLAY_NAME --query [].objectId --output tsv)
Write-output $objectid
az deployment group create `
--resource-group $currentEnv.AZ_RESOURCE_GROUP_NAME `
--template-file "./arm_templates/rbac-role.json" `
--parameters `
principalId=$objectid `
builtInRoleType="['StorageQueueDataContributor', 'StorageTableDataContributor','AzureServiceBusDataOwner']"
剧本实际上正在消亡的一行是这样的:
$objectid=$(az ad sp list --display-name $MANAGED_ID_DISPLAY_NAME --query [].objectId --output tsv)
当我在谷歌上搜索这个错误时,我看到一些文章指出,应用程序注册必须是所有者或用户访问管理员。
我尝试将“用户访问管理”权限添加到失败的应用程序reg 2。但这并没有什么区别。
以下是显示Subscription角色的屏幕截图。有效的注册是以小写“bi”结尾的注册。失败的是名称中包含“BI Deploy”的名称。