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

使用 Bicep 创建 Azure 基于角色的访问控制 (Azure RBAC) 资源

Azure 具有强大的基于角色的访问控制(RBAC)系统。 有关 Azure RBAC 的详细信息,请参阅 什么是 Azure 基于角色的访问控制(Azure RBAC)? 通过使用 Bicep,可以编程方式定义 RBAC 角色分配和角色定义。

角色分配

通过角色分配,可以授予主体(例如用户、组或服务主体)对特定 Azure 资源的访问权限。

若要定义角色分配,请创建类型为Microsoft.Authorization/roleAssignments的资源。 角色定义具有多个属性,包括范围、名称、角色定义 ID、主体 ID 和主体类型。

Scope

角色分配适用于特定 范围,用于定义要向其授予访问权限的资源或资源集。 有关详细信息,请参阅了解 Azure RBAC 的范围

角色分配是 扩展资源,这意味着它们适用于另一个资源。 以下示例展示了如何创建存储帐户以及为该存储帐户指定的角色分配:

param location string = resourceGroup().location
param storageAccountName string = 'stor${uniqueString(resourceGroup().id)}'
param storageSkuName string = 'Standard_LRS'
param roleDefinitionResourceId string
param principalId string

resource storageAccount 'Microsoft.Storage/storageAccounts@2025-06-01' = {
  name: storageAccountName
  location: location
  kind: 'StorageV2'
  sku: {
   name: storageSkuName
  }
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  scope: storageAccount
  name: guid(storageAccount.id, principalId, roleDefinitionResourceId)
  properties: {
    roleDefinitionId: roleDefinitionResourceId
    principalId: principalId
    principalType: 'ServicePrincipal'
  }
}

如果未显式指定范围,Bicep 将使用该文件的 targetScope。 在以下示例中,未 scope 指定任何属性,因此角色分配的范围限定为订阅:

param roleDefinitionResourceId string
param principalId string

targetScope = 'subscription'

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(subscription().id, principalId, roleDefinitionResourceId)
  properties: {
    roleDefinitionId: roleDefinitionResourceId
    principalId: principalId
    principalType: 'ServicePrincipal'
  }
}

小窍门

使用满足要求所需的最小范围。

例如,如果需要向托管标识授予对单个存储帐户的访问权限,则良好的安全做法是在该存储帐户的范围创建角色分配,而不是在资源组或订阅范围创建。

Name

角色分配的资源名称必须是全局唯一标识符 (GUID)。

角色分配资源名称在 Microsoft Entra 租户中必须唯一,即使范围更窄。

若要使 Bicep 部署可重复,请务必使用确定的名称,即每次部署时都使用相同的名称。 良好的做法是创建结合使用范围、主体 ID 和角色 ID 的 GUID。 使用 guid() 函数可帮助你为角色分配名称创建确定性的 GUID 是个好主意,如以下示例所示:

name: guid(subscription().id, principalId, roleDefinitionResourceId)

角色定义 ID

你分配的角色可以是内置角色定义或 自定义角色定义。 若要使用内置角色定义, 请查找相应的角色定义 ID。 例如, 参与者 角色的角色定义 ID 为 b24988ac-6180-42a0-ab88-20f7382dd24c.

创建角色分配资源时,需要指定完全限定的资源 ID。 内置角色定义 ID 是订阅范围的资源。 建议使用 existing 资源来引用内置角色,并使用 .id 属性访问其完全限定的资源 ID:

param principalId string

@description('This is the built-in Contributor role. See https://learn.microsoft.com/azure/role-based-access-control/built-in-roles#contributor')
resource contributorRoleDefinition 'Microsoft.Authorization/roleDefinitions@2022-04-01' existing = {
  scope: subscription()
  name: 'b24988ac-6180-42a0-ab88-20f7382dd24c'
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(resourceGroup().id, principalId, contributorRoleDefinition.id)
  properties: {
    roleDefinitionId: contributorRoleDefinition.id
    principalId: principalId
    principalType: 'ServicePrincipal'
  }
}

校长

必须将 principalId 属性设置为表示主体的 Microsoft Entra 标识符的 GUID。 在 Microsoft Entra ID 中,这有时称为 对象 ID

principalType 属性指定主体是用户、组还是服务主体。 托管标识是一种服务主体形式。

小窍门

在 Bicep 中创建角色分配时设置 principalType 属性非常重要。 否则,可能会遇到间歇性的部署错误,尤其是使用服务主体和托管标识时。

以下示例演示如何创建用户分配的托管标识和角色分配:

param location string = resourceGroup().location
param roleDefinitionResourceId string

var managedIdentityName = 'MyManagedIdentity'

resource managedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2025-01-31-preview' = {
  name: managedIdentityName
  location: location
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(resourceGroup().id, managedIdentity.id, roleDefinitionResourceId)
  properties: {
    roleDefinitionId: roleDefinitionResourceId
    principalId: managedIdentity.properties.principalId
    principalType: 'ServicePrincipal'
  }
}

资源删除行为

从 Microsoft Entra ID 中删除用户、组、服务主体或托管标识时,建议删除任何角色分配。 不会自动删除它们。

引用已删除主体 ID 的任何角色分配都无效。 如果尝试对另一个角色分配重复使用角色分配的名称,则部署将失败。 若要解决此问题,应在重新创建旧角色分配之前删除旧角色分配,或者确保在部署新角色分配时使用唯一名称。 本 快速入门模板 演示如何在 Bicep 模块中定义角色分配,并将主体 ID 用作角色分配名称的种子值。

自定义角色定义

使用自定义角色定义可以定义一组权限,然后可以使用角色分配将权限分配给主体。 有关角色定义的详细信息,请参阅 了解 Azure 角色定义

若要创建自定义角色定义,请定义 Microsoft.Authorization/roleDefinitions 类型的资源。 有关示例,请参阅 订阅级部署快速入门指南中的创建新的角色定义

角色定义资源名称在 Microsoft Entra 租户中必须唯一,即使可分配的范围更窄。

注释

某些服务管理自己的角色定义和分配。 例如,Azure Cosmos DB 维护其自己的 Microsoft.DocumentDB/databaseAccounts/sqlRoleAssignmentsMicrosoft.DocumentDB/databaseAccounts/sqlRoleDefinitions 资源。 有关详细信息,请参阅特定服务的文档。