Azure ASP.NET核心3:Don';t如果可以';t通行钥匙保险库

Azure ASP.NET核心3:Don';t如果可以';t通行钥匙保险库,azure,asp.net-core,azure-keyvault,asp.net-core-3.0,Azure,Asp.net Core,Azure Keyvault,Asp.net Core 3.0,我有一个ASP.NET Core 3应用程序,它使用Azure Key Vault。只要我在VisualStudio中登录到我的Microsoft帐户,它在生产中运行良好,在vs2019中也可以进行良好的调试。但当我没有登录到VS时,它会失败并阻止应用程序启动,而不是继续应用程序启动。我希望当一个开发人员没有登录到VS时(其他开发人员也是这样工作的)。以下是相关的启动代码: public static IHostBuilder CreateHostBuilder(string[] args)

我有一个ASP.NET Core 3应用程序,它使用Azure Key Vault。只要我在VisualStudio中登录到我的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()));
        }
    }
公共静态IHostBuilder CreateHostBuilder(字符串[]args)
{
{
静态字符串GetKeyVaultEndpoint()=>“https://[myappvalut].vault.azure.net”;
var azureServiceTokenProvider=新azureServiceTokenProvider();
var keyVaultClient=新的keyVaultClient(
新建KeyVaultClient.AuthenticationCallback(
azureServiceTokenProvider.KeyVaultTokenCallback);
返回Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.UseStartup();
})
.ConfigureHostConfiguration(c=>c.AddAzureKeyVault(GetKeyVault端点()、KeyVault客户端、新的DefaultKeyVault SecretManager());
}
}
以下是我在创业时遇到的一个例外:

Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException: '参数:连接字符串:[未指定连接字符串], 资源:,授权: . 异常消息:已尝试 以下三种方法可以获得访问令牌,但都不起作用


是否有任何优雅的方法可以从中恢复并继续启动应用程序,或者仅在我知道我有连接字符串时添加密钥库?

您可以使用服务主体访问密钥库。这是文件

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;
});

您可以使用服务主体访问密钥库。这是文件

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;
});

我的文章中有一个可以改编的例子:

基本上,您可以从在此之前注册的提供程序构造配置,并检查是否有密钥vault 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();
公共静态IWebHost BuildWebHost(字符串[]args)=>
WebHost.CreateDefaultBuilder(args)
.UseStartup()
.ConfigureAppConfiguration((ctx,构建器)=>
{
//从我们已有的源代码构建配置
var config=builder.Build();
var keyvaultUrl=config[“KeyVault:BaseUrl”];
如果(!string.IsNullOrEmpty(KeyVault URL))
{
//将密钥库添加到配置管道
builder.AddAzureKeyVault(KeyVault URL);
} 
})
.Build();

我的文章中有一个可以改编的例子:

基本上,您可以从在此之前注册的提供程序构造配置,并检查是否有密钥vault 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();
公共静态IWebHost BuildWebHost(字符串[]args)=>
WebHost.CreateDefaultBuilder(args)
.UseStartup()
.ConfigureAppConfiguration((ctx,构建器)=>
{
//从我们已有的源代码构建配置
var config=builder.Build();
var keyvaultUrl=config[“KeyVault:BaseUrl”];
如果(!string.IsNullOrEmpty(KeyVault URL))
{
//将密钥库添加到配置管道
builder.AddAzureKeyVault(KeyVault URL);
} 
})
.Build();