将选项模式与Azure Key Vault一起使用?

时间:2019-05-17 02:08:45

标签: c# asp.net .net-core azure-keyvault

我有Azure Key Vault成功地在我的Web应用程序上运行,并且能够使用_config["foo"]访问机密 ,但我很好奇是否可以通过Azure Key Vault实施选项模式。我目前使用以下方法将AppSettings.json绑定到一个类:

services.Configure<AppSettings>(o => 
configuration.GetSection("AppSettings").Bind(o));

但是我找不到我应该用来绑定Azure关键文件库机密的正确“部分”。这可能吗,或者这是尚未实现的功能?

2 个答案:

答案 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软件包:

  • Azure.Identity
  • Microsoft.Azure.KeyVault

注意:即使在同一篇文章中提到,上面的链接也表明该软件包已过时:

  • Microsoft.Azure.Services.AppAuthentication

所以不要安装它。

在我的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
}