Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从函数内获取Azure托管标识_Python_Arm_Azure Managed Identity - Fatal编程技术网

Python 从函数内获取Azure托管标识

Python 从函数内获取Azure托管标识,python,arm,azure-managed-identity,Python,Arm,Azure Managed Identity,我正在为我的pythonAzure函数应用程序使用Azure托管标识功能 并且希望能够从功能应用程序本身中获取当前分配的客户端ID 搜索文档和azureidentitypython源代码并没有给出我期望的结果 也许我可以: 查询Azure实例元数据服务我自己以获取此ID。(不太喜欢此选项) 在ARM部署阶段/或稍后手动将其设置为env变量。(看起来不错,效率很高,但不确定这里的最佳做法是什么) 更新 使用ARM模板和env变量进行管理 使用系统标识部署FunctionApp 规定系统标识为同一函

我正在为我的python
Azure函数应用程序使用
Azure托管标识
功能
并且希望能够从功能应用程序本身中获取当前分配的
客户端ID

搜索文档和
azureidentity
python源代码并没有给出我期望的结果

也许我可以:

  • 查询
    Azure实例元数据服务
    我自己以获取此ID。(不太喜欢此选项)
  • 在ARM部署阶段/或稍后手动将其设置为
    env
    变量。(看起来不错,效率很高,但不确定这里的最佳做法是什么)
  • 更新

    使用ARM模板和env变量进行管理

  • 使用系统标识部署FunctionApp
  • 规定系统标识为同一函数的env变量PP
  • 想法是使用Microsoft.Resources/deployments子模板更新功能应用程序配置,包括:

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

    最简单的选择是转到“功能”应用程序的“标识”选项卡,然后打开“系统分配的托管标识”。 然后,您可以获得访问令牌,而无需提供客户端id,因为令牌请求只会选择系统分配的标识(如果功能应用有)

    如果您使用的是“用户分配的托管标识”,那么您需要通过env或直接在代码中提供客户机id

    您可能已经意识到,但还有一点需要注意:您还需要确保您已经为正在访问的资源授予了对托管标识的访问权限,例如:转到功能应用程序需要访问的Azure资源,并为您的托管标识分配适当的角色

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

    更新

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

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

     {
      access_token: <...>,
      resource: <...>,
      token_type: 'Bearer',
      client_id: <client_id of the managed identity used to get this token>
    }
    
    {
    访问令牌:,
    资源:,
    令牌类型:'承载',
    客户识别码:
    }
    
    最简单的选择是转到“功能”应用程序的“标识”选项卡,然后打开“系统分配的托管标识”。 然后,您可以获得访问令牌,而无需提供客户端id,因为令牌请求只会选择系统分配的标识(如果功能应用有)

    如果您使用的是“用户分配的托管标识”,那么您需要通过env或直接在代码中提供客户机id

    您可能已经意识到,但还有一点需要注意:您还需要确保您已经为正在访问的资源授予了对托管标识的访问权限,例如:转到功能应用程序需要访问的Azure资源,并为您的托管标识分配适当的角色

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

    更新

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

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

     {
      access_token: <...>,
      resource: <...>,
      token_type: 'Bearer',
      client_id: <client_id of the managed identity used to get this token>
    }
    
    {
    访问令牌:,
    资源:,
    令牌类型:'承载',
    客户识别码:
    }
    
    谢谢,我使用的是系统分配的标识,可以在没有客户端id的情况下获取/使用令牌。但是出于我自己的目的仍然需要客户端id(进行一些日志过滤)。到目前为止,通过env进行资源调配似乎是一种选择,尽管我希望避免。是的,这是您的最佳选择。我根据您的尝试更新了答案,希望对YouTunks有效。我使用的是系统分配的标识,并且能够获取/使用令牌而无需客户端id。但出于我自己的目的,仍然需要客户端id(做一些日志过滤)。到目前为止,通过env进行资源调配似乎是一个不错的选择,尽管我想避免这样做。是的,这是你最好的选择。我会根据你的尝试更新答案,希望对你有用