使用新的 MSI 功能部署 Microsoft.Web 资源时,已创建用户的 principalId GUID 在部署后可见。下面的屏幕截图显示了 ARM 模板中的结构。
稍后在管道中获取此 GUID 以便能够在(例如)Data Lake Store 中分配访问权限的最佳方法是什么?
是否可以使用任何现有的 ARM 模板函数来执行此操作?
使用新的 MSI 功能部署 Microsoft.Web 资源时,已创建用户的 principalId GUID 在部署后可见。下面的屏幕截图显示了 ARM 模板中的结构。
稍后在管道中获取此 GUID 以便能够在(例如)Data Lake Store 中分配访问权限的最佳方法是什么?
是否可以使用任何现有的 ARM 模板函数来执行此操作?
我自己也为此苦苦挣扎。对我有用的解决方案可以在此处的评论中找到。
本质上,您创建了一个针对您正在使用 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]"
}
希望这可以帮助任何遇到同样问题的人!
以下是一些示例模板:https ://github.com/rashidqureshi/MSI-Samples展示了 a)如何授予 RBAC 对 ARM 资源的访问权限 b)如何使用 MSI 的 OID 为 keyvault 创建访问策略
有一种获取身份信息的新方法。您可以直接从支持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]",