【问题标题】:Cannot authenticate when debugging Azure Functions in local with VS Code使用 VS Code 在本地调试 Azure Functions 时无法进行身份验证
【发布时间】:2020-07-28 15:19:54
【问题描述】:

我在 Python 中有一个 Azure 函数,我从 Key Vault 获得了一个秘密。 Azure Function 是配置了 Managed IdentityApp Service 的一部分,因此我没有服务主体。要访问 Key Vault,我使用的是 azure 标识库和 DefaultAzureCredential 类。

我的问题是在本地调试此功能时,未检测到凭据。我知道调试器使用不同的 shell,所以没有设置登录环境变量。我试图在 launch.json 中指定“env”属性,但得到一个警告,我不允许添加它,如果我将它重命名为“环境”也是一样的。我还尝试了 InteractiveBrowserCredential 类以使用我的用户帐户登录作为解决方法,但随后凭据被视为不正确而无法访问 Key Vault。

如何设置我的 VS Code 本地调试环境以使用应用服务的托管标识?

这是我的代码的一个例外:

import os
import logging
import azure.functions as func
from azure.storage.blob import BlobServiceClient
from azure.identity import DefaultAzureCredential, UsernamePasswordCredential
from azure.keyvault.secrets import SecretClient

def main(req: func.HttpRequest) -> func.HttpResponse:
    vault_url = os.environ['KeyVaultUrl']
    credential = DefaultAzureCredential()
    secret_client = SecretClient(vault_url=vault_url, credential=credential)
    access_key = secret_client.get_secret(os.environ['StorageSecretName'])

谢谢

【问题讨论】:

    标签: python azure visual-studio-code


    【解决方案1】:

    如果你想在本地运行带有DefaultAzureCredential的函数,我们需要在local.settings.json中添加这些设置。 json 文件用于存储应用程序设置、连接字符串和本地开发工具使用的设置。更多详情请参考herehere

    例如

    local.settings.json

    {
      "IsEncrypted": false,
      "Values": {
        "AzureWebJobsStorage": "",
        "FUNCTIONS_WORKER_RUNTIME": "python",  
        "AZURE_CLIENT_ID": "42e***522d988c4",
        "AZURE_CLIENT_SECRET": "Gbx2eK***ClJDfQpIjoae:",
        "AZURE_TENANT_ID": "e4c9ab4e-b***230ba2a757fb"
      }
    }
    

    代码

    import logging
    import azure.functions as func
    import os
    from azure.keyvault.secrets import SecretClient
    from azure.identity import DefaultAzureCredential
    
    async def main(req: func.HttpRequest) -> func.HttpResponse:
        logging.info('Python HTTP trigger function processed a request.')
        
        vault_url = 'https://testsql.vault.azure.net/'
        credential = DefaultAzureCredential()
        secret_client = SecretClient(vault_url=vault_url, credential=credential)
        access_key = secret_client.get_secret('DBConnectionString')
        return func.HttpResponse(access_key.value,
            mimetype="application/json",)
        
    

    【讨论】:

    • 感谢您的帮助 Jim,我正在按照您所说的进行设置。只有一个问题:你从哪里得到客户的秘密?从托管标识创建的安全主体中,我找不到它。我是否需要手动创建安全主体并停用托管身份?
    • @Alssanro 我们无法获取托管身份客户端密码。我建议你手动创建一个安全主体
    猜你喜欢
    • 2018-08-12
    • 2019-05-27
    • 2018-08-29
    • 1970-01-01
    • 2016-02-28
    • 2013-05-30
    • 2021-01-01
    • 1970-01-01
    • 2022-07-27
    相关资源
    最近更新 更多