ASP.NET Core 3:如果无法访问密钥保险库,请不要停止应用启动

时间:2019-10-13 17:59:17

标签: azure asp.net-core azure-keyvault asp.net-core-3.0

我有一个使用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?

2 个答案:

答案 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();