我有一个使用Azure Key Vault的ASP.NET Core 3应用程序。只要我在Visual Studio中登录了我的Microsoft帐户,它在生产中就可以正常工作,并且在vs2019中也可以进行良好的调试。但是,当我没有登录VS时,它会失败并阻止应用程序启动,而不是继续进行应用程序启动。我希望在开发人员未登录VS时可以使用此功能(因为其他开发人员以这种方式工作)。这是相关的启动代码:
public static IHostBuilder CreateHostBuilder(string[] args)
{
{
static string GetKeyVaultEndpoint() => "https://[myappvalut].vault.azure.net";
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(
azureServiceTokenProvider.KeyVaultTokenCallback));
return Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureHostConfiguration(c => c.AddAzureKeyVault(GetKeyVaultEndpoint(), keyVaultClient, new DefaultKeyVaultSecretManager()));
}
}
这是我启动时遇到的异常:
Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException: '参数:连接字符串:[未指定连接字符串], 资源:https://vault.azure.net,权限: https://login.windows.net/[guid]。异常消息: 以下三种获取访问令牌的方法,但是没有一种有效。
是否有任何优雅的方法可以从中恢复并继续应用启动,或者仅在我知道有连接字符串的情况下才添加Key Vault?
答案 0 :(得分:0)
您可以使用服务主体来访问密钥库。 Here是文档。
string clientId = Environment.GetEnvironmentVariable("akvClientId");
string clientSecret = Environment.GetEnvironmentVariable("akvClientSecret");
KeyVaultClient kvClient = new KeyVaultClient(async (authority, resource, scope) =>
{
var adCredential = new ClientCredential(clientId, clientSecret);
var authenticationContext = new AuthenticationContext(authority, null);
return (await authenticationContext.AcquireTokenAsync(resource, adCredential)).AccessToken;
});
答案 1 :(得分:0)
我的文章中有一个示例可以修改:https://joonasw.net/view/aspnet-core-azure-keyvault-msi。
基本上,您是从那时起注册的提供者构造配置的,并检查我们是否具有密钥库URL。 在您的情况下,您应该可以采用类似的方法。
请注意,该示例是针对ASP.NET Core 2.1制作的:
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.ConfigureAppConfiguration((ctx, builder) =>
{
//Build the config from sources we have
var config = builder.Build();
var keyvaultUrl = config["KeyVault:BaseUrl"];
if (!string.IsNullOrEmpty(keyVaultUrl))
{
//Add Key Vault to configuration pipeline
builder.AddAzureKeyVault(keyvaultUrl);
}
})
.Build();