从功能内部获取Azure托管身份

时间:2020-07-10 15:01:00

标签: python arm azure-managed-identity

我正在为我的Python Azure Managed Identity使用Azure Functions App功能 并且希望能够从Function App本身中获取当前分配的Client ID

在文档和azure-identity Python源中搜索并没有得到我期望的结果。

也许我可以:

  1. 亲自查询Azure Instance Metadata Service以获得此ID。 (对此选项不是很满意)
  2. 在ARM部署阶段/或稍后手动将其设置为env变量。 (似乎不错且高效,但不确定此处的最佳做法是什么)

更新

受管理,可与ARM模板和环境变量一起使用

  1. 使用系统身份部署FunctionApp
  2. 将系统身份设置为同一FunctionApp的env变量

想法是使用Microsoft.Resources/deployments子模板来通过以下方式更新Function App配置:

{
    "name": "AZURE_CLIENT_ID",
    "value": "[reference(resourceId('Microsoft.Web/sites', variables('appName')), '2019-08-01', 'full').identity.principalId]"
},

1 个答案:

答案 0 :(得分:0)

最简单的选项是转到“功能”应用程序的“身份”选项卡,然后打开“系统分配的受管身份”。 然后,您无需提供client_id就可以获取访问令牌,因为如果Function应用程序有一个身份标识请求,令牌请求只是选择系统分配的身份。

如果您使用的是“用户分配的受管身份”,则需要通过env或直接在您的代码中提供client_id:

您可能已经知道了,但只是一条附加说明:您还需要确保已授予正在访问的资源的托管身份的访问权限,例如:转到您的Function应用需要的Azure资源访问并为您的托管身份分配适当的角色。

您的选项1(查询Azure实例元数据服务)仅在VM上可用。

更新

由于您需要将client_id用于其他目的,因此您也可以考虑从对访问令牌的请求的响应中读取它:client_id是JSON令牌中与访问令牌一起返回给您的参数之一,值是您使用的托管身份的client_id(在您的情况下,是系统分配的托管身份)

以下是示例令牌响应来说明这一点:

 {
  access_token: <...>,
  resource: <...>,
  token_type: 'Bearer',
  client_id: <client_id of the managed identity used to get this token>
}