在.net Framework中进行本地开发时,如何使用Key Vault?

时间:2019-07-15 18:21:05

标签: asp.net azure azure-keyvault

我想知道是否可以像使用Key Vault设置.net核心应用程序一样设置.net mvc应用程序。

https://docs.microsoft.com/en-us/aspnet/core/security/key-vault-configuration?view=aspnetcore-2.2#secret-storage-in-the-development-environment

我希望能够在不配置Azure Key Vault的情况下在本地开发环境中获取秘密。

在.net核心应用程序中,我可以按照上面的链接进行操作,

// ran this command in powershell
dotnet user-secrets set "db-connection-string" "db-connection-string-value"

在Program.cs中使用空端点设置密钥库(这仅用于测试)。

public static IWebHost BuildWebHost(string[] args) =>
           WebHost.CreateDefaultBuilder(args)
               .ConfigureAppConfiguration((ctx, builder) =>
               {
                   var keyVaultEndpoint = GetKeyVaultEndpoint();
                   if (!string.IsNullOrEmpty(keyVaultEndpoint))
                   {
                       var azureServiceTokenProvider = new AzureServiceTokenProvider();
                       var keyVaultClient = new KeyVaultClient(
                           new KeyVaultClient.AuthenticationCallback(
                               azureServiceTokenProvider.KeyVaultTokenCallback));
                       builder.AddAzureKeyVault(
                           keyVaultEndpoint, keyVaultClient, new DefaultKeyVaultSecretManager());
                   }
               }
            ).UseStartup<Startup>()
             .Build();

        private static string GetKeyVaultEndpoint() => "";

我可以使用以下代码在本地访问我的秘密。

 public void OnGet()
        {
            Message = "My key val = " + _configuration["db-connection-string"];
        }

在我的asp.net应用程序中,我可以从Azure密钥保管库提取秘密。我只是不想在本地进行开发时这样做,因为每个开发人员与本地数据库的连接字符串可能会稍有不同,并且要求他们在Azure中使用Key Vault会很烦人,并且会令人沮丧。也许我们不应该将Key Vault用于“旧版”应用程序。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

这似乎与我们的开发环境类似。

我们希望开发人员使用密钥库中的某些值,但要能够为其本地环境覆盖特定值。 (尤其是数据库连接字符串)。

ConfigureAppConfiguration方法中,您可以注册多个配置提供程序。如果两个配置提供程序写入同一配置密钥,则最后注册的提供程序将获得优先级。

知道这一点,您可以拥有一个本地文件appSettings.json,该文件定义了数据库连接字符串:

{
     "db-connection-string": "Data Source = DEVELOPMENT_PC;Initial Catalog=MyLocalDatabase;Integrated Security=True"
}

然后在您注册了密钥库提供程序之后, 注册该提供程序。

.ConfigureAppConfiguration((ctx, builder) =>
{
    var keyVaultEndpoint = GetKeyVaultEndpoint();
    if (!string.IsNullOrEmpty(keyVaultEndpoint))
    {
        var azureServiceTokenProvider = new AzureServiceTokenProvider();
        var keyVaultClient = new KeyVaultClient(
            new KeyVaultClient.AuthenticationCallback(
                azureServiceTokenProvider.KeyVaultTokenCallback
            )
        );
        builder.AddAzureKeyVault(
            keyVaultEndpoint,
            keyVaultClient,
            new DefaultKeyVaultSecretManager()
        );
    }

    var appSettingsFilePath = GetJsonAppSettingsFile(); // Hardcoded, or add some other configuratin logic
    if (!string.IsNullOrEmpty(appSettingsFilePath))
    {
        builder.AddJsonFile(appSettingsFilePath);
    }
}

很显然,生产环境将有一个空的或不存在的appSettings.json文件,并且所有值都将从密钥存储区派生。或者,您可以在生产环境中使用appSettings.json文件,但仅用于不包含机密的配置值。