gpt4 book ai didi

azure-active-directory - 如何使用 ARM 模板为应用注册服务主体部署角色分配?

转载 作者:行者123 更新时间:2023-12-01 11:13:31 26 4
gpt4 key购买 nike

在我当前的项目中,我正在使用 Azure AD 中预先创建的应用注册服务主体。我正在使用 ARM 模板创建一个 StorageV2 帐户和一些 blob 容器,然后创建一个 roleAssignment,为其中一个服务主体提供 Storage Blob Contributor 权限。 ARM 模板的相关部分在本文末尾。

我发现,如果我使用普通 AD 用户(例如我自己或我的同事)的 ObjectId 并将其设置为 PrincipalId ,则脚本可以正确运行。但是,我无法将其与服务主体一起使用。

如果我使用服务主体的 ObjectId ,则会出现以下错误:

Deployment failed. Correlation ID: 40e0c146-165a-47c0-b022-ac04781d8194. {
"error": {
"code": "PrincipalTypeNotSupported",
"message": "Principals of type Application cannot validly be used in role assignments."
}
}

为 Azure Powershell 用户发现了一些我应该使用应用程序(客户端)ID 的建议后,我尝试了这一点,但出现以下错误(Guids 已编辑):
Deployment failed. Correlation ID: 5c725a51-230a-4d85-bb61-b2f4cdf849ff. {
"error": {
"code": "PrincipalNotFound",
"message": "Principal 9f****30 does not exist in the directory db****75."
}
}

所以 ObjectId它可以找到但不能使用, ClientId它找不到。

我发现如果我使用 Azure Powershell 并使用 New-AzureRmRoleAssignment 命令,我可以通过将服务主体的 PrincipalTypeNotSupported 提供给 ObjectId 开关来重现 -ObjectId 错误。但是,该命令还有一个 -ServicePrincipalName 开关作为替代,如果我提供服务主体的 ClientId ,它就可以工作!

ARM 模板是否有任何等效的 -ServicePrincipalName,如果没有,还有其他方法可以实现吗?我可以使用 Azure Powershell 作为解决方法,但它比我想要的要麻烦。

如果这是功能差距,在哪里报告它的最佳位置?

ARM模板相关部分如下:
"resources": [
{
"name": "[variables('storageAccountName')]",
"type": "Microsoft.Storage/storageAccounts",
"location": "[resourceGroup().location]",
"apiVersion": "2018-07-01",
"sku": {
"name": "[parameters('storageAccountSku')]"
},
"dependsOn": [],
"tags": {
"displayName": "Storage Account"
},
"kind": "StorageV2",
"properties": {
"accessTier": "Hot",
"supportsHttpsTrafficOnly": true,
"networkAcls": {
"bypass": "AzureServices",
"virtualNetworkRules": [],
"ipRules": [],
"defaultAction": "Deny"
}
},
"resources": [
{
"type": "blobServices/containers",
"name": "[concat('default/', variables('myBlobContainerName'))]",
"apiVersion": "2018-07-01",
"dependsOn": [
"[variables('storageAccountName')]"
],
"resources": [
{
"type": "Microsoft.Authorization/roleAssignments",
"name": "[variables('myRoleAssignmentGuid')]",
"apiVersion": "2018-07-01",
"properties": {
"roleDefinitionId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/ba92f5b4-2d11-453d-a403-e96b0029c9fe')]",
"principalId": "[variables('myPrincipalId')]"
},
"dependsOn": [
"[concat('Microsoft.Storage/storageAccounts/', variables('storageAccountName'), '/blobServices/default/containers/', variables('myBlobContainerName'))]"
]
}
]
}
]
}
]

最佳答案

最终解决了这个问题,部分归功于来自@4c74356b41 的指针。

创建应用程序注册对象时,还会在企业应用程序下创建同名对象。它具有相同的 ApplicationId ,但不同的 ObjectId ,它是我们的 ARM 脚本需要的这个企业应用程序对象的 ObjectId

您可以通过转到应用程序注册条目在门户中找到此对象,然后单击 Managed application in... 后面的链接

Screenshot of App Registration with Link
Screenshot of App Registration with Link

进入相应的企业应用程序对象后,您可以从属性中获取 ObjectId,并将其用作 ARM 模板中 principalId 的值。

在撰写本文时,Microsoft 文档对此有点含糊,术语 Application 和 Service Principal 似乎过载了。 This article 说当你注册一个应用程序时,你会得到一个应用程序对象和一个服务主体对象,但一次不使用企业应用程序这个短语,或者引用应用程序注册 对象 本身,所以不清楚哪个是哪个。

我假设应用程序 == 应用程序注册和服务主体 == 企业应用程序。 This SO post 似乎表明是这种情况,就像上面的解决方案一样。

关于azure-active-directory - 如何使用 ARM 模板为应用注册服务主体部署角色分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56565980/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com