从函数中获取 Azure 托管标识

Fetch Azure Managed Identity from within Function

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

搜索文档,azure-identity python 来源没有给出我期望的结果。

也许我可以:

  1. 自己查询Azure Instance Metadata Service得到这个ID。 (对这个选项不是很满意)
  2. 在 ARM 部署阶段/或稍后手动将其设置为 env 变量。 (看起来不错且高效,但不确定这里的最佳实践是什么)

更新

管理 o 让它与 ARM 模板和环境变量一起工作

  1. 使用系统标识部署 FunctionApp
  2. 将系统标识提供为同一 FunctionApp 的环境变量

想法是使用 Microsoft.Resources/deployments 子模板更新 Function App 配置:

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

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

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

你可能已经知道,但只是一个额外的注意事项:你还需要确保你已经为你正在访问的资源授予了对你的托管标识的访问权限,例如:转到 Azure 资源你的函数应用程序需要访问并为您的托管身份分配适当的角色。

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

更新

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

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

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