.NET 7控制台应用:如何从IConfiguration获取KeyVault值?
在.NET 7控制台应用中通过IConfiguration直接获取App Configuration与KeyVault值
要实现直接从IConfiguration读取KeyVault密钥,核心是让KeyVault的密钥被集成到应用的配置体系中,无需额外通过IKeyVaultService调用。以下是具体修改步骤:
1. 调整KeyVault与App Configuration的集成配置
你的ConfigureKeyVault扩展方法已连接App Configuration并配置了KeyVault凭证,但还需要确保KeyVault密钥能映射到IConfiguration的键上,有两种常用方式:
方式一:利用App Configuration的KeyVault引用(推荐)
在Azure Portal的App Configuration中,创建名为SomeObj:ClientId和SomeObj:ClientSecret的配置项,类型选择Key Vault引用,分别指向KeyVault中对应的密钥。保持你的扩展方法不变(已包含启用引用解析的逻辑):
public static void ConfigureKeyVault(this IConfigurationBuilder config) { var settings = config.Build(); var appConfigConnString = settings.GetConnectionString("AppConfig"); var kvOptions = new DefaultAzureCredentialOptions { ManagedIdentityClientId = settings.GetValue<string>("KeyVault:ClientId") }; config.AddAzureAppConfiguration(options => { options.Connect(appConfigConnString) .ConfigureKeyVault(x => x.SetCredential(new DefaultAzureCredential(kvOptions))); }); }
方式二:直接从KeyVault加载指定密钥
如果不想依赖App Configuration的引用,可直接在配置中指定要加载的KeyVault密钥,映射到IConfiguration的对应键:
public static void ConfigureKeyVault(this IConfigurationBuilder config) { var settings = config.Build(); var appConfigConnString = settings.GetConnectionString("AppConfig"); var kvOptions = new DefaultAzureCredentialOptions { ManagedIdentityClientId = settings.GetValue<string>("KeyVault:ClientId") }; config.AddAzureAppConfiguration(options => { options.Connect(appConfigConnString) .ConfigureKeyVault(x => x.SetCredential(new DefaultAzureCredential(kvOptions))) // 直接加载KeyVault中的密钥,映射到IConfiguration的键 .AddKeyVault("SomeObj:ClientId") .AddKeyVault("SomeObj:ClientSecret"); }); }
2. 修改服务注册,直接使用IConfiguration
在注册IApiFactory时,从服务提供者中获取IConfiguration实例,直接读取密钥值:
services.AddScoped<IApiFactory, ApiFactory>(sp => { var configuration = sp.GetRequiredService<IConfiguration>(); return new ApiFactory( configuration.GetValue<string>("SomeObj:ClientId"), configuration.GetValue<string>("SomeObj:ClientSecret")); });
如果你的Startup类需要直接使用IConfiguration,可在构造函数中注入:
public class Startup { private readonly IConfiguration _configuration; public Startup(IHostingEnvironment env, IConfiguration configuration) { _configuration = configuration; // 其他初始化逻辑 } public void ConfigureServices(IServiceCollection services) { services.AddScoped<IApiFactory, ApiFactory>(_ => { return new ApiFactory( _configuration.GetValue<string>("SomeObj:ClientId"), _configuration.GetValue<string>("SomeObj:ClientSecret")); }); // 其他服务注册 } }
注意事项
- 确保用于访问KeyVault的身份(Managed Identity或服务主体)拥有KeyVault的密钥读取权限(Get、List)。
- 若使用App Configuration的KeyVault引用,需确保App Configuration的身份同样拥有KeyVault的对应权限。
- 配置构建时的
config.Build()是为了读取App Configuration连接字符串,这一步必要,但要确保它在配置源添加的合适位置,避免遗漏其他配置。
内容的提问来源于stack exchange,提问作者Dan Beaulieu
相关产品推荐
相关产品推荐

