如何将ASP.NET Core API通过Azure Key Vault连接到Azure托管的数据库
你当前的代码已经拿到了Key Vault中存储的连接字符串,但仅定义了变量接收值,没有将该值注入到应用的配置系统中,同时ConfigureAppConfiguration委托不支持异步写法,异步调用会导致配置加载时序异常。
第一步:修正配置加载代码
修改CreateHostBuilder代码,移除异步委托,将获取到的连接字符串添加到应用配置源:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, builder) => { var client = new SecretClient( new Uri("https://example.vault.azure.net/"), new DefaultAzureCredential()); // 改用同步方法获取密钥,避免异步时序问题 KeyVaultSecret secret = client.GetSecret("ConnectionString"); // 将连接字符串添加到应用配置中,键名可自定义,保持后续读取一致即可 builder.AddInMemoryCollection(new Dictionary<string, string> { {"ConnectionStrings:DefaultConnection", secret.Value} }); } ).ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
如果不需要单独拉取单个密钥,也可以直接用Azure Key Vault配置扩展批量加载所有密钥,写法更简洁:
首先安装NuGet包Azure.Extensions.AspNetCore.Configuration.Secrets,然后修改代码:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, builder) => { builder.AddAzureKeyVault( new Uri("https://example.vault.azure.net/"), new DefaultAzureCredential()); } ).ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
该写法会自动将Key Vault中所有你有权限访问的密钥同步到应用配置中,密钥名直接作为配置键使用。
第二步:配置数据库上下文
在Startup.cs的ConfigureServices方法中,从配置中读取连接字符串配置你的数据库上下文即可,以SQL Server + EF Core为例:
public void ConfigureServices(IServiceCollection services) { // 其他服务配置... services.AddDbContext<你的DbContext类名>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); }
第三步:验证身份权限
- 本地开发时,确保你Visual Studio/CLI登录的Azure账号拥有该Key Vault的密钥获取权限,否则本地调试会报错
- 部署到Azure后,确保你的API服务已经开启系统分配/用户分配托管标识,且你之前在Key Vault访问策略中为该标识授予的权限已经生效
配置完成后,你在控制器、服务中注入数据库上下文即可正常使用,和之前明文写在appsettings.json中的使用逻辑完全一致。
内容的提问来源于stack exchange,提问作者HMSWarspite
相关产品推荐
相关产品推荐

