在 .net 框架中本地开发时如何使用 Key Vault?

Rya*_* E. 2 asp.net azure azure-keyvault

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

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"
Run Code Online (Sandbox Code Playgroud)

在 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() => "";
Run Code Online (Sandbox Code Playgroud)

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

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

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

And*_*erd 5

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

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

在该ConfigureAppConfiguration方法中,您可以注册多个配置提供程序。如果两个配置提供程序写入相同的配置键,则最后注册的提供程序优先。

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

{
     "db-connection-string": "Data Source = DEVELOPMENT_PC;Initial Catalog=MyLocalDatabase;Integrated Security=True"
}
Run Code Online (Sandbox Code Playgroud)

然后注册 Key Vault 提供程序注册此提供程序。

.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);
    }
}
Run Code Online (Sandbox Code Playgroud)

很明显,生产环境会有一个空的或不存在的appSettings.json文件,所有的值都会从密钥库中导出。或者,您appSettings.json在生产环境中使用该文件,但仅用于不包含机密的配置值。