如何配置Azure WebApp从Azure Key Vault拉取环境变量/配置值
.Net Core 3.1 WebApp 接入Azure Key Vault拉取配置操作步骤
1. 为WebApp开启系统分配托管标识
- 进入Azure门户中你的WebApp管理页,左侧菜单栏找到「标识」选项
- 切换到「系统分配」标签页,将状态切换为开启后点击保存,Azure会自动为该WebApp生成一个可在Azure AD中识别的服务主体,后续给Key Vault授权就用这个主体。
2. 配置Key Vault访问权限与存储敏感配置
- 找到你用来存储凭据的Key Vault实例(没有则新建,建议和WebApp部署在同一区域降低网络延迟)
- 先在Key Vault左侧菜单找到「访问配置」,权限模型选择「Vault访问策略」即可(新手操作更直观,熟悉RBAC也可以选Azure角色控制模式)
- 进入「访问策略」页,点击「添加访问策略」:
- 机密权限只需要勾选获取、列出两个最小权限即可,不要给修改、删除等多余权限
- 选择主体时,搜索你刚才开启托管标识的WebApp名称,选中后保存访问策略
- 将之前存在WebApp应用设置里的敏感值,逐个作为机密上传到Key Vault:
注意:Key Vault不支持机密名称中包含冒号,你的配置层级分隔符
:要替换为--作为机密名,比如原配置路径AzureAd:ClientId对应机密名必须设为AzureAd--ClientId,AzureAd:TenantId对应AzureAd--TenantId,ApplicationInsights:InstrumentationKey对应ApplicationInsights--InstrumentationKey,否则配置提供程序无法正确映射到原有配置结构,你代码里读配置的逻辑完全不需要改。
3. 修改项目代码接入Key Vault配置源
- 首先给你的.Net Core 3.1项目安装两个必需的NuGet包:
Install-Package Azure.Extensions.AspNetCore.Configuration.Secrets Install-Package Azure.Identity
- 打开项目根目录的
Program.cs,修改CreateHostBuilder方法,在原有配置加载逻辑后追加Key Vault配置源,参考代码如下:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, config) => { // 先加载默认的appsettings、环境变量等配置 var builtConfig = config.Build(); // Key Vault地址不是敏感信息,可以直接存在WebApp的应用设置里,配置项Key设为KeyVault:VaultUri,值格式为https://<你的Key Vault名称>.vault.azure.net/ var keyVaultEndpoint = builtConfig["KeyVault:VaultUri"]; if (!string.IsNullOrEmpty(keyVaultEndpoint)) { // DefaultAzureCredential会自动识别环境:部署到WebApp时用托管标识鉴权,本地调试时自动读取你本地VS/Azure CLI的登录凭据,不需要硬编码任何访问密钥 config.AddAzureKeyVault(new Uri(keyVaultEndpoint), new DefaultAzureCredential()); } }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
- 回到WebApp的应用设置页,添加配置项
KeyVault:VaultUri,值填你自己的Key Vault地址即可,这个值不是敏感信息,不需要存在Key Vault里。
4. 发布验证
- 代码修改完成后,重新打包发布到Azure WebApp
- 发布成功后,把之前存在WebApp应用设置里的敏感配置项(ClientId、TenantId、InstrumentationKey等)全部删除,重启WebApp
- 调用原有依赖这些配置的接口,如果服务正常运行说明配置生效。如果启动报错,直接去WebApp的日志流排查即可,常见问题基本是两类:一是Key Vault访问策略没配对,WebApp没有机密的读取权限;二是Key Vault里的机密名称没按
--分隔的规则命名,导致配置映射失败。
内容的提问来源于stack exchange,提问作者One Developer
相关产品推荐
相关产品推荐

