在 .NET 6 应用程序的 Program.cs(启动)中获取 Key Vault ServiceClient

Get Key Vault ServiceClient within Program.cs (startup) in a .NET 6 app

我在谷歌上搜索了几个小时都没有成功,希望这里有人能帮助我。我创建了一个 Entity Framework DbContext,我在程序中对其进行了初始化(.NET 6 中不再需要 Startup.cs)。连接字符串取决于 Azure Key Vault 中的 SQL 密码。因此,Key Vault 和 DbContext 的注册都在 Program.cs 中完成。但是我如何从 KeyVault 检索机密以放入连接字符串中?我不想在这里手动创建一个 SecretClient 实例,但是以某种方式注入它...

我现在有:

builder.Services.AddAzureClients(clientBuilder =>
{
    clientBuilder.AddSecretClient(new Uri(builder.Configuration.GetSection("KeyVault:VaultUri").Value))
        .WithCredential(new DefaultAzureCredential());
});
builder.Services.AddDbContext<MyContext>(options =>
{
    // How to get an instance of SecretClient here via DI? I need to call the serviceClient.GetSecret("sql-password") here to put it inside the connectionstring
    // var sqlPassword = builder.Configuration.GetSection("sql-password").Value <-- also returns null
    var sqlPassword = "get-this-password-from-key-vault";
    options.UseSqlServer(string.Format(builder.Configuration.GetConnectionString("MyConnectionString"), sqlPassword));
});

我在几个博客上读到,当您将 SecretClient 添加到服务时,它应该读取所​​有机密并将它们添加到 builder.Configuration ,这意味着您应该能够像这样阅读它:

var sqlPassword = builder.Configuration["sql-password"]

var sqlPassword = builder.Configuration.GetSection("sql-password").Value

他们两个 return null 。所以我 运行 在这里没有选择。如果有人能解决这个简单的问题,我将不胜感激。谢谢!

PS:我知道Key Vault注册成功了;当我在控制器中使用 ServiceClient 时,我可以成功检索到秘密。

您可以通过 https://github.com/Azure/azure-sdk-for-net/blob/main/sdk/extensions/Microsoft.Extensions.Azure/README.md 中描述的多种方式注册 SecretClient。在这种情况下,您甚至可以实例化一个 SecretClient,将其添加到配置生成器中,然后直接使用它。或者一旦注册到配置构建器,请参考存储在 SecretClient:

中的所需配置值
var builder = WebApplication.CreateBuilder(args);

var keyVaultEndpoint = new Uri(Environment.GetEnvironmentVariable("VaultUri"));
builder.Configuration.AddAzureKeyVault(keyVaultEndpoint, new DefaultAzureCredential());

// Add services to the container.
builder.Services.AddDbContext<MyContext>(options =>
{
    var sqlPassword = builder.Configuration["secret-password"];
    options.UseSqlite(string.Format(builder.Configuration.GetConnectionString("MyConnectionString"), sqlPassword));
});

在 Key Vault 中,在这种情况下只需添加一个名为“secret-password”的机密。