【问题标题】:.NET Core 3.1 Docker in Visual Studio accessing Azure Key VaultVisual Studio 中的 .NET Core 3.1 Docker 访问 Azure Key Vault
【发布时间】:2021-05-15 03:39:05
【问题描述】:

我正在尝试在 Visual Studio 中本地运行 Docker 中的 .NET Core 3.1 应用程序。应用程序需要访问 Azure Key Vault。

当我运行应用程序时,我收到以下错误:

发生了一个或多个错误。 (参数:连接字符串:[否 指定的连接字符串],资源:https://vault.azure.net, 权威: https://login.windows.net/53d4d1e1-3360-4735-8aad-21c6155f528a。 异常消息:尝试了以下 3 种方法来获取访问权限 令牌,但它们都不起作用。

参数:连接字符串:[否 指定的连接字符串],资源:https://vault.azure.net, 权威: https://login.windows.net/53d4d1e1-3360-4735-8aad-21c6155f528a。 异常消息:尝试使用托管服务标识获取令牌。 无法获取访问令牌。连接被拒绝

参数: 连接字符串:[未指定连接字符串],资源: https://vault.azure.net,权威: https://login.windows.net/53d4d1e1-3360-4735-8aad-21c6155f528a。 异常消息:尝试使用 Visual Studio 获取令牌。使用权 无法获取令牌。环境变量 LOCALAPPDATA 不是 设置。

参数:连接字符串:[未指定连接字符串], 资源:https://vault.azure.net,权威: https://login.windows.net/53d4d1e1-3360-4735-8aad-21c6155f528a。 异常消息:尝试使用 Azure CLI 获取令牌。访问令牌 无法获得。 /bin/bash: az: 没有这样的文件或目录

注意:使用 IIS Express 可以正常工作!请帮忙! :D

【问题讨论】:

  • 代码在哪里?还要清理消息以便我们可以阅读它们 - 一大块文本很难阅读。
  • 对不起是什么意思?代码在我机器上本地的 docker 容器中运行...?
  • 我相信您需要在有权访问 Key Vault 的用户上下文中运行 VS,以便它可以获取令牌。
  • 接受的答案是不安全的,因为它让您将敏感信息存储在应该签入源代码控制的文件中(而且它首先违背了使用 Key Vault 的目的);相反,我在下面发布了alternate answer,您应该考虑一下。

标签: visual-studio azure docker azure-keyvault


【解决方案1】:

使用 DefaultAzureCredential 对 Azure 密钥库进行身份验证时,请设置所需的 environment variables

在这个场景中,就是在Dockerfile中设置环境变量。

ENV AZURE_CLIENT_ID=<Your AZURE CLIENT ID>
ENV AZURE_CLIENT_SECRET=<Your CLIENT SECRET>
ENV AZURE_TENANT_ID=<Your TENANT ID>

【讨论】:

  • 将客户端机密存储在公共配置文件中是一个很大的禁忌,它首先违背了使用 Azure Key Vault 的目的;而是考虑我有posted below的替代答案。
【解决方案2】:

为了避免被接受的答案(因为明显的安全问题),并简化和自动化E. Staal's answer (on a duplicate question),我想出了这个:

  1. 更新您的.gitignore 文件,在其底部添加以下行:

    appsettings.local.json
    
  2. 在解决方案资源管理器中右键项目,点击Properties;在Build Events 选项卡中,找到Pre-build event command line 文本框并添加以下代码:

    cd /d "$(ProjectDir)"
    if exist "appsettings.local.json" del "appsettings.local.json"
    if "$(ConfigurationName)" == "Debug" (
    az account get-access-token  --resource=https://vault.azure.net > appsettings.local.json
    )
    
  3. 在您的launchSettings.json(或使用项目设置下的可视化编辑器)配置以下值:

    {
      "profiles": {
        // ...
        "Docker": {
          "commandName": "Docker",
          "environmentVariables": {
            "DOTNET_ENVIRONMENT": "Development",
            "AZURE_TENANT_ID": "<YOUR-AZURE-TENANT-ID-HERE>"
          }
        }
      }
    }
    
  4. 在您的 Program.cs 文件中找到 CreateHostBuilder 方法并相应地更新 ConfigureAppConfiguration 块 - 这是我的示例:

    Host.CreateDefaultBuilder(args).ConfigureAppConfiguration
    (
        (ctx, cfg) =>
        {
            if (ctx.HostingEnvironment.IsDevelopment())
            {
                cfg.AddJsonFile("appsettings.local.json", true);
            }
    
            var builtConfig = cfg.Build();
            var keyVault = builtConfig["KeyVault"];
            if (!string.IsNullOrWhiteSpace(keyVault))
            {
                var accessToken = builtConfig["accessToken"];
                cfg.AddAzureKeyVault
                (
                    $"https://{keyVault}.vault.azure.net/",
                    new KeyVaultClient
                    (
                        string.IsNullOrWhiteSpace(accessToken)
                        ? new KeyVaultClient.AuthenticationCallback
                        (
                            new AzureServiceTokenProvider().KeyVaultTokenCallback
                        )
                        : (x, y, z) => Task.FromResult(accessToken)
                    ),
                    new DefaultKeyVaultSecretManager()
                );
            }
        }
    )
    

如果这仍然不起作用,请验证 az login 是否已执行以及 az account get-access-token --resource=https://vault.azure.net 是否适合您。

【讨论】:

    猜你喜欢
    • 2018-05-22
    • 2019-06-09
    • 2020-05-23
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 2020-08-08
    • 2020-02-11
    相关资源
    最近更新 更多