【问题标题】:Fetch Azure Managed Identity from within Function从函数中获取 Azure 托管标识
【发布时间】:2020-07-10 15:01:00
【问题描述】:

我正在为我的 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 的 env 变量

想法是使用Microsoft.Resources/deployments 子模板来更新函数应用配置:

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

【问题讨论】:

    标签: python arm azure-managed-identity


    【解决方案1】:

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

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

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

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

    更新

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

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

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

    【讨论】:

    • 谢谢,我正在使用系统分配的身份,并且能够在没有 client_id 的情况下获取/使用令牌。但仍然需要 client_id 用于我自己的目的(进行一些日志过滤)。到目前为止,看起来通过 env 进行配置是一种选择,尽管我想避免它
    • 是的,这是你最好的选择
    • 我根据您的尝试更新了答案,希望对您有用
    猜你喜欢
    • 1970-01-01
    • 2020-05-02
    • 2019-10-10
    • 2021-02-20
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2020-10-04
    相关资源
    最近更新 更多