我正在创建一个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的资源主体。如果未由租户管理员安装该应用程序,或者未得到该租户中任何用户的同意,则可能会发生这种情况。
答案 0 :(得分:1)
要对get-access-token
使用解决方法:
az account get-access-token ...
并检查您是否能够获取令牌;您使用正确的租户和订阅吗?docker run --env KVTOKEN=$Env ...
命令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);
答案 1 :(得分:1)
应该是:az account get-access-token --resource=https://vault.azure.net。然后你会得到你可以使用的访问令牌:) 这对我有用。