快速入门:将 Bicep 文件部署为服务主体

在本快速入门中,你将部署一个 Bicep 文件,该文件包含使用仅限应用的身份验证(也称为非交互式身份验证)Microsoft Graph 资源。 可以将此机制用于零接触部署集成到持续集成和持续交付(CI/CD)管道中。

若要使用委托身份验证或交互式身份验证进行部署,请参阅 使用 Microsoft Graph 资源创建 Bicep 文件。

重要

Microsoft Graph Bicep 目前为预览版。 有关 beta 版本、预览版或尚未正式发布的版本的 Azure 功能所适用的法律条款,请参阅 Microsoft Azure 预览版的补充使用条款

先决条件

创建服务主体并分配 Azure 角色

在仍从上一个会话登录到 Azure CLI 时,请创建稍后用于部署 Bicep 文件的服务主体。

在本快速入门中,服务主体是使用应用程序密码(也称为客户端密码)创建的。 此外,为服务主体 分配托管标识参与者角色,范围限定为资源组:

注意

本快速入门仅使用应用程序密码进行简单和测试。 请勿在生产环境中使用。

# Create a resource group
az group create --name exampleRG --location eastus

# Create a service principal with the Managed Identity Contributor role. Replace {myServicePrincipalName}, {mySubscriptionId}, and {myResourceGroupName} with your values.
az ad sp create-for-rbac --name {myServicePrincipalName} --role "Managed Identity Contributor" --scopes "/subscriptions/{mySubscriptionId}/resourceGroups/{myResourceGroupName}"

输出控制台:

{
  "appId": "myServicePrincipalId",
  "displayName": "myServicePrincipalName",
  "password": "myServicePrincipalPassword",
  "tenant": "myOrganizationTenantId"
}

输出包括 password 密钥。 请确保复制此值 - 它不可检索。

将 Microsoft Graph 权限分配给服务主体

使用 Microsoft Graph PowerShell 向 Service 主体授予 Group.ReadWrite.All 仅限应用程序的权限。 特权角色管理员角色允许向自己授予 AppRoleAssignment.ReadWrite.All 和 Application.Read.All 权限来执行此操作。

注意

已授予 AppRoleAssignment.ReadWrite.All 权限的应用只能由相应的用户访问。 有关详细信息,请参阅 AppRoleAssignment.ReadWrite.All

# Authenticate to Microsoft Graph
Connect-MgGraph -Scopes "AppRoleAssignment.ReadWrite.All","Application.Read.All"

# Find the service principal created to run the deployment
$mySP = Get-MgServicePrincipalByAppId -AppId "myServicePrincipalId"

# Find the service principal for Microsoft Graph
$graphSP = Get-MgServicePrincipalByAppId -AppId "00000003-0000-0000-c000-000000000000"

# Assign Group.ReadWrite.All app-only permission (id = 62a82d76-70ea-41e2-9197-370581804d09)
New-MgServicePrincipalAppRoleAssignedTo -ResourceId $graphSP.Id -ServicePrincipalId $graphSP.Id -PrincipalId $mySP.Id -AppRoleId "62a82d76-70ea-41e2-9197-370581804d09" 

以服务主体身份登录以部署 Bicep 文件

以之前创建的服务主体身份登录。

# Sign in with the service principal created earlier. This sample uses the Bash console.
spID=$(az ad sp list --display-name myServicePrincipalName --query "[].{spID:appId}" --output tsv)
tenantID=$(az ad sp list --display-name myServicePrincipalName --query "[].{tenantID:appOwnerOrganizationId}" --output tsv)
echo "Using appId $spID in tenant $tenantID"

az login --service-principal --username $spID --password {paste your SP password here} --tenant $tenantID

重要

如果想要避免在控制台中显示自己的密码并以交互方式使用 az login,请在 bash 中使用 read -s 命令。

read -sp "Azure password: " AZ_PASS && echo && az login --service-principal -u <app-id> -p $AZ_PASS --tenant <tenant>

部署 Bicep 文件

现在,使用资源组的范围部署 Bicep 文件。

az deployment group create --resource-group exampleRG --template-file main.bicep

注意

由于复制延迟,将托管服务标识(MSI)添加为 Microsoft Entra 组的所有者可能会导致部署失败。 稍候一下,然后再次部署相同的 Bicep 文件。

清理资源

不再需要 Azure 资源时,请使用 Azure CLI 或 Azure PowerShell 模块删除创建的资源组。

注意

资源组是 Azure 概念,对 Microsoft Graph 资源没有影响。 需要清理 Microsoft Graph 资源,并发出Microsoft Graph 的其他请求。 为此,可以使用 Azure CLI 或 Azure PowerShell、 Microsoft Graph CLIMicrosoft Graph PowerShell

以下示例演示了先删除 Azure 资源的命令,然后使用 Azure CLI 和 Azure PowerShell 删除 Microsoft Graph 资源。

# Delete the resource group
az group delete --name exampleRG

# Delete the Microsoft Graph group
az rest --method delete --url 'https://graph.microsoft.com/v1.0/groups%28uniqueName=%27myExampleGroup%27%29'

# Delete the client service principal
spID=$(az ad sp list --display-name myServicePrincipalName --query "[].{spID:id}" --output tsv)
az ad sp delete --id $spID