如何使用托管身份访问asp.net核心dockerize应用的Azure密钥保险库

问题描述

我正在创建一个asp.net核心Web应用程序,并且在Visual Studio中我尝试使用托管身份来获取Azure密钥库时,在以下代码上没有任何问题。

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。异常消息:尝试了以下三种方法来获取访问令牌,但是没有一种有效。 参数:连接字符串:[未指定连接字符串],资源: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的资源主体。如果未由租户管理员安装该应用程序,或者未得到该租户中任何用户的同意,则可能会发生这种情况。

解决方法

要对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 --resource=https://vault.azure.net。然后你会得到你可以使用的访问令牌:) 这对我有用。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...