如何获取对应用服务的 Azure MSI 的引用?

How to get a reference to an Azure MSI for an app service?

我一直在测试最近发布的 Azure 托管服务标识 (MSI),并使用此处文档中描述的 ARM 模板方法成功地为我们的应用服务创建了 MSI:How to use Azure Managed Service Identity (public preview) in App Service and Azure Functions

但是,我想授予托管标识对其他资源(如密钥保管库)的访问权限。我已经能够通过门户执行此操作,但需要能够在 PowerShell 中编写脚本才能与我们的持续部署构建集成。

我已通过执行 Set-AzureRmKeyVaultAccessPolicy cmdlet 使用 PowerShell 成功创建了访问权限。但是,我只能使用硬编码的对象 ID 执行此操作,在创建 MSI 后从门户手动复制和粘贴。

我的问题是,如何在 PowerShell 中获取对 MSI 对象 ID 的引用,以便我可以授予对其他资源的访问权限?我能找到的唯一示例(例如 this one)仅指 VM 而不是应用程序服务。

你可以使用 Get-AzureADServicePrincipal.

$web=Get-AzureADServicePrincipal -SearchString "<name>"
$web.ObjectId

默认情况下,该名称是您的网络应用名称。

更新:

对于 OP 的场景,我们可以使用 template 来获取对 Azure MSI 的引用。

如果你想使用 Azure RM PowerShell 命令行开关,你可以使用:

$(Get-AzureRmADServicePrincipal -SearchString $Name | where {$_.DisplayName -eq $Name}).Id

where 部分是为了确保您拥有特定的 SP 而不是多个结果 starting 具有相同的名称。

编辑: 即使是上述情况也可能导致多个值。更好的解决方案是像这样进一步过滤:

Get-AzureRmADServicePrincipal -SearchString $Name | where {($_.DisplayName -eq $Name) -and ($_.ServicePrincipalNames -match "https://identity.azure.net")}

因为您使用 ARM 部署了资源,所以我想添加这个答案,因为您可以仅使用 ARM 来完成:

  1. 为您的密钥保管库启用 ARM 模板部署:

    {
      "type": "Microsoft.KeyVault/vaults",   
      "name": "[parameters('keyVaultName')]",       
      ...
      "properties": {
        "enabledForTemplateDeployment": true,
        ...
      }
    }
    
  2. 创建系统标识:

    {
      "type": "Microsoft.Web/sites",
      "name": "[parameters('functionAppName')]",       
      ...
      "identity": {
        "type": "SystemAssigned"
      }
      ...
    }
    
  3. 创建访问策略:

    {
      "apiVersion": "2018-02-14",
      "type": "Microsoft.KeyVault/vaults/accessPolicies",
      "name": "[concat(parameters('keyVaultName'), '/add')]",
      "properties": {
        "accessPolicies": [
          {
            "tenantId": "[parameters('tenantId')]",
            "objectId": "[reference(resourceId('Microsoft.Web/sites', parameters('functionAppName')), '2018-02-01', 'Full').identity.principalId]",
            "permissions": {
              "secrets": [ "get" ]
            }
          }
        ]
      },
      "dependsOn": [
        "[resourceId('Microsoft.KeyVault/vaults', parameters('keyVaultName'))]",
        "[resourceId('Microsoft.Web/sites', parameters('functionAppName'))]"
      ]
    }
    

使用最新的 AzureRM 模块 (6.13.1)

$AppProp = Get-AzureRmWebApp -ResourceGroupName $resourceGroupName -Name $name

Write-Output $AppProp.Identity

此身份 属性 提供了有关 MSI 的所有必需详细信息。

Type        : SystemAssigned

TenantId    : c764619f-8856-4a9f-a81e-eeb0c3f93592

PrincipalId : 3d317dfe-5589-4aae-94a4-51f1776979a7