你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

什么是 delegatedManagedIdentityResourceId 属性?

在 Azure 中,delegatedManagedIdentityResourceId 属性用于将角色正确分配给不同租户中的托管标识。 此分配在处理 Azure 市场中发布的托管应用程序时特别有用,因为此时发布者和客户存在于不同的租户中。

我们为什么需要它?

当客户部署来自该市场的托管应用程序时,发布者负责管理托管资源组 (MRG) 中的资源。 但是,作为部署模板的一部分执行的任何角色分配都发生在发布者的租户中。 当在客户的租户中创建托管标识时,这些分配会带来麻烦,因为如果角色分配尝试在错误的租户中查找标识,角色分配会失败。

delegatedManagedIdentityResourceId 属性通过显式指定托管标识存在的位置来解决此问题,确保角色分配过程能够正确定位和分配权限。

工作原理

托管标识创建

部署托管应用程序时,会在客户的租户中创建托管标识。

角色分配

角色分配部署发生在发布者的租户下,因此自然会在该租户中查找标识。

使用 delegatedManagedIdentityResourceId

通过指定正确的资源 ID:

  • 对于系统分配的标识:使用保存相应标识的资源的资源 ID。 例如,函数应用或逻辑应用。
  • 对于用户分配的标识:使用标识本身的资源 ID。

如何应用 delegatedManagedIdentityResourceId

若要正确设置角色分配,请在 Azure 资源管理器模板(ARM 模板)的角色分配部分中添加 delegatedManagedIdentityResourceId 属性。 示例:

{
  "type": "Microsoft.Authorization/roleAssignments",
  "apiVersion": "2022-04-01",
  "properties": {
    "roleDefinitionId": "<role-definition-id>",
    "principalId": "<principal-id>",
    "delegatedManagedIdentityResourceId": "<resource-id-of-identity>"
  }
}

常见错误和疑难解答

由于缺少标识而导致角色分配失败

  • 确保在 delegatedManagedIdentityResourceId 中提供了正确的资源 ID。
  • 验证客户租户中是否存在托管标识。

因拒绝分配而阻止访问

  • 拒绝分配会阻止客户访问 MRG。
  • 确保在客户的租户中正确引用管理 MRG 的发布者标识。

配置不当的部署上下文

  • 已发布托管应用并启用发布者访问的 AMA 部署发生在发布者的租户中。
  • 确保正确设置 delegatedManagedIdentityResourceId 以引用客户的租户标识。

角色分配 PUT 请求仅在跨租户场景中受支持

具有 delegatedManagedIdentityResourceId 的角色分配 PUT 请求仅在跨租户场景中受支持,不支持在同一租户内进行部署。 若要在测试期间在同一租户内使用该请求,请添加一个参数以包括该属性,如下所示:

{
  "comments": "Using cross-tenant delegatedManagedIdentityResourceId property",
  "type": "Microsoft.Authorization/roleAssignments",
  "apiVersion": "2021-04-01-preview",
  "name": "[guid(resourceGroup().id, variables('<identityName>'), variables('<roleDefinitionId>'))]",
  "dependsOn": [
    "[variables('<identityName>')]"
  ],
  "properties": {
    "roleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions',variables('<roleDefinitionId>'))]",
    "principalId": "[reference(variables('<identityName>')).principalId]",
    "principalType": "<PrincipalType>",
    "scope": "[resourceGroup().id]",
    "delegatedManagedIdentityResourceId": "[if(parameters('crossTenant'), resourceId('Microsoft.ManagedIdentity/userAssignedIdentities',variables('<identityName>')), json('null'))]"
  }
}

后续步骤