【问题标题】:how to access azure key vault for asp.net core dockerize app using managed identity如何使用托管标识访问 azure key vault for asp.net core dockerize app
【发布时间】:2020-12-23 15:20:52
【问题描述】:

我正在创建一个 asp.net 核心网络应用程序,在 Visual Studio 中,当我尝试使用托管标识获取 azure key vault 时,我在下面的代码上没有任何问题

public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((context, config) =>
            {
                config.AddAzureKeyVault(new AzureKeyVaultConfigurationOptions
                {
                    Vault = "https://testvaultXYZ.vault.azure.net/",
                    Client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(new AzureServiceTokenProvider().KeyVaultTokenCallback)),
                });
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });

现在我让这个应用程序在 docker/container 中运行,当我在本地容器中运行这个应用程序时,上面的代码出现以下错误,

Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException:'参数:连接字符串:[未指定连接字符串],资源:https://vault.azure.net,授权:https://login.windows.net/xxxxxxxxxxx。异常消息:尝试了以下 3 种方法来获取访问令牌,但都没有奏效。 参数:连接字符串:[未指定连接字符串],资源:https://vault.azure.net,权限:https://login.windows.net/xxxxxxxxx。异常消息:尝试使用托管服务标识获取令牌。无法连接到托管服务标识 (MSI) 端点。请检查您是否在具有 MSI 设置的 Azure 资源上运行。 参数:连接字符串:[未指定连接字符串],资源:https://vault.azure.net,权限:https://login.windows.net/xxxxxxxxxx。异常消息:尝试使用 Visual Studio 获取令牌。无法获取访问令牌。未设置环境变量 LOCALAPPDATA。 参数:连接字符串:[未指定连接字符串],资源:https://vault.azure.net,权限:https://login.windows.net/xxxxxxxxxxxx。异常消息:尝试使用 Azure CLI 获取令牌。无法获取访问令牌。 /bin/bash: az: 没有这样的文件或目录

我了解在 docker 容器中运行时用户是不同的。这里有什么解决办法?

我看到了一些使用以下命令获取访问令牌的解决方案,

$Env:ACCESS_TOKEN=(az account get-access-token  --resource=https://testvaultXYZ.vault.azure.net | ConvertFrom-Json).accessToken

但这里也会出现类似的错误,

获取令牌请求返回 http 错误:400 和服务器响应:{"error":"invalid_resource","error_description":"AADSTS500011:在名为 XXXXXXX 的租户中找不到名为 https://testvaultXYZ.vault.azure.net 的资源主体。这可能发生如果应用程序尚未由租户的管理员安装或租户中的任何用户同意。

【问题讨论】:

    标签: docker containers asp.net-core-webapi azure-keyvault azure-managed-identity


    【解决方案1】:

    应该是:az account get-access-token --resource=https://vault.azure.net。然后你得到你可以使用的访问令牌:) 这对我有用。

    【讨论】:

      【解决方案2】:

      要使用get-access-token 的解决方法:

      1. 请确保您已登录 azure cli,只需在终端中运行命令az account get-access-token ... 并检查您是否能够获取令牌;您是否使用正确的租户和订阅?
      2. 将结果保存到终端会话中的环境变量中
      3. 将此变量作为环境变量传递给docker run --env KVTOKEN=$Env ... 命令
      4. 不要忘记在应用程序中读取这个变量并将其传递给KeyVaultClient构造函数:
      var token = Environment.GetEnvironmentVariable("KVTOKEN");
      KeyVaultClient kvclient = string.IsNullOrEmpty(token) ? new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(new AzureServiceTokenProvider().KeyVaultTokenCallback)) : new KeyVaultClient((authority, resource, scope) => token);
      

      【讨论】:

      • 谢谢。当我输入命令 az account get-access-token 时,它会给出令牌。这是我可以使用的令牌吗?
      • @user584018 因为您设置了正确的资源(在您的情况下为 keyvault),它应该可以工作。您可以在 jwt.ms 处查看令牌中的内容。这是一个检查 jwt 令牌的微软网站。
      • @user584018 不应该只是az account get-access-token,我最后写了省略号。在您的情况下,它必须是 az account get-access-token --resource=https://testvaultXYZ.vault.azure.net
      • @user584018 如果我的回答帮助您将其标记为正确。
      • 好的。谢谢。 az account get-access-token --resource=https://testvaultXYZ.vault.azure.net 仍然给我错误
      猜你喜欢
      • 2020-06-02
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 2017-09-24
      • 2020-08-29
      • 2021-07-29
      • 2021-10-11
      • 2021-07-17
      相关资源
      最近更新 更多