2

我想知道是否有一种方法可以设置 .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"

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

4

1 回答 1

5

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

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

在该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在生产环境中使用该文件,但仅用于不包含机密的配置值。

于 2019-07-16T00:07:05.660 回答