28

使用新的 MSI 功能部署 Microsoft.Web 资源时,已创建用户的 principalId GUID 在部署后可见。下面的屏幕截图显示了 ARM 模板中的结构。

在此处输入图像描述

稍后在管道中获取此 GUID 以便能够在(例如)Data Lake Store 中分配访问权限的最佳方法是什么?

是否可以使用任何现有的 ARM 模板函数来执行此操作?

4

3 回答 3

62

我自己也为此苦苦挣扎。对我有用的解决方案可以在此处的评论中找到。

本质上,您创建了一个针对您正在使用 MSI 支持创建的资源的变量。然后,您可以使用该变量来获取特定的tenantId 和 principalId 值。不理想,但它有效。在我的示例中,我正在为函数应用配置 Key Vault 权限。

要创建变量,请使用以下语法。

"variables": {
    "identity_resource_id": "[concat(resourceId('Microsoft.Web/sites', variables('appName')), '/providers/Microsoft.ManagedIdentity/Identities/default')]"
}

要获取 tenantId 和 principalId 的实际值,请使用以下语法引用它们:

{
    "tenantId": "[reference(variables('identity_resource_id'), '2015-08-31-PREVIEW').tenantId]",
    "objectId": "[reference(variables('identity_resource_id'), '2015-08-31-PREVIEW').principalId]"
}

希望这可以帮助任何遇到同样问题的人!

于 2017-09-27T01:04:57.423 回答
3

以下是一些示例模板:https ://github.com/rashidqureshi/MSI-Samples展示了 a)如何授予 RBAC 对 ARM 资源的访问权限 b)如何使用 MSI 的 OID 为 keyvault 创建访问策略

于 2017-09-18T17:19:17.253 回答
2

有一种获取身份信息的新方法。您可以直接从支持Azure 资源的托管标识(过去是托管服务标识)的资源中获取它们。

{
  "tenantId": "[reference(resourceId('Microsoft.Web/sites', variables('serviceAppName')),'2019-08-01', 'full').identity.tenantId]",
  "objectId": "[reference(resourceId('Microsoft.Web/sites', variables('serviceAppName')),'2019-08-01', 'full').identity.principalId]",
}

您还可以获取其他资源组或/和订阅中资源的主体 ID。ResourceId支持可选参数:

  "tenantId": "[reference(resourceId(variables('resourceGroup'), 'Microsoft.Web/sites', variables('serviceAppName')),'2019-08-01', 'full').identity.tenantId]",

或者

"tenantId": "[reference(resourceId(variables('subscription'), variables('resourceGroup'), 'Microsoft.Web/sites', variables('serviceAppName')),'2019-08-01', 'full').identity.tenantId]",
于 2021-02-09T12:50:54.837 回答