我有Azure Key Vault成功地在我的Web应用程序上运行,并且能够使用_config["foo"]
访问机密
,但我很好奇是否可以通过Azure Key Vault实施选项模式。我目前使用以下方法将AppSettings.json绑定到一个类:
services.Configure<AppSettings>(o =>
configuration.GetSection("AppSettings").Bind(o));
但是我找不到我应该用来绑定Azure关键文件库机密的正确“部分”。这可能吗,或者这是尚未实现的功能?
答案 0 :(得分:0)
对于将来可能遇到此问题的任何人,答案都比我想的要简单,尽管我仍然不确定它在幕后的工作原理。
services.Configure<AzureSettings>(Configuration);
就是所需要的全部,AzureSettings具有与传入的每个密钥库机密相对应的属性。
答案 1 :(得分:0)
将此答案归档在“我可以使用”下,但我欢迎评论使用Azure Key Vault机密的更好方法,尤其是因为我发现的在线示例不一致。
首先,我正在使用Visual Studio2019。它具有用于开发身份验证的设置,如下所述:
Service-to-service authentication to Azure Key Vault using .NET
有很多验证方式。我只是尝试过Visual Studio技术,但是一旦有了这项工作,就不难弄清楚如何使用其他方法。即使我在生产环境的代码中有一个防护,我也没有在生产中尝试下面的代码。我只是颠倒了逻辑,以测试开发环境中的关键文件库。话虽如此,这就是我所做的:
安装以下NuGet软件包:
注意:即使在同一篇文章中提到,上面的链接也表明该软件包已过时:
所以不要安装它。
在我的Web api .Net Core 3.1应用中,程序类代码具有附加的 ConfigureAppConfiguration()调用:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((ctx, builder) =>
{
if (ctx.HostingEnvironment.IsProduction())
{
var config = builder.Build();
var tokenProvider = new AzureServiceTokenProvider();
var kvClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(tokenProvider.KeyVaultTokenCallback));
builder.AddAzureKeyVault(config["KeyVault:BaseUrl"], kvClient, new DefaultKeyVaultSecretManager());
}
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
注意:如果要在开发中测试此内容而不是使用secrets.json设置,请更改此行:
if (ctx.HostingEnvironment.IsProduction())
到
if (!ctx.HostingEnvironment.IsProduction())
旁注:在Visual Studio中,右键单击您的项目,然后单击“管理用户密码”,或使用dotnet CLI user-secrets命令对其进行管理。密钥保管箱设置将覆盖secrets.json设置。
我的appsettings.json文件具有以下部分:
"KeyVault": {
"BaseUrl": "https://mykeyvaultname.vault.azure.net/",
"Secrets": {
"Secret1": "foo",
"Secret2": "bar"
}
},
请注意program.cs中的此行与KeyVault部分的位置匹配:
builder.AddAzureKeyVault(config["KeyVault:BaseUrl"], kvClient, new DefaultKeyVaultSecretManager());
阅读有关密钥库的本教程,以了解如何设置机密:
Tutorial: Use Key Vault references in an ASP.NET Core app
我创建了两个类来匹配两个不同的配置。第一个仅匹配密钥库中的秘密。第二个匹配项是密钥库和appsettings文件,但密钥库的机密优先:
此类仅匹配我的密钥库中的两个秘密:“ MySecretKey和” MyOtherSecretKey”
public class KeyVaultSettingsModel
{
public string MyOtherSecretKey { get; set; }
public string MySecretKey { get; set; }
}
和另一个与appsettings.json文件中的“ KeyVault:Secrets”路径匹配的类:
public class KeyVaultSettingsModel1
{
public string Secret1 { get; set; }
public string Secret2 { get; set; }
}
如果您在appsettings文件中具有嵌套值,则密钥库中的秘密名称必须与之匹配。但是您必须将“:”字符替换为“-”。这意味着您的秘密姓名必须采用以下格式:
KeyVault--Secrets--Secret1
否
KeyVault:Secrets:Secret1
完成上述配置后,就可以使用“选项”模式。在Startup.cs中,配置上面的模型以与IOptions *接口一起使用,并在需要时使用DI访问它们。
public void ConfigureServices(IServiceCollection services)
{
// other code
services.Configure<KeyVaultSettingsModel>(Configuration);
services.Configure<KeyVaultSettingsModel1>(Configuration.GetSection("KeyVault:Secrets"));
// other code
}