我想知道是否可以像使用Key Vault设置.net核心应用程序一样设置.net mvc应用程序。
我希望能够在不配置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用于“旧版”应用程序。任何帮助表示赞赏。
答案 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
文件,但仅用于不包含机密的配置值。