.NET 7 Web API配置:从Azure配置读取设置,仅本地用appsettings.json
实现.NET 7 Web API从Azure App Configuration读取配置(本地保留appsettings.json)
需求说明
我有一个.NET 7 Web API项目,希望切换为从Azure App Configuration读取应用设置,替代传统的appsettings.json文件。核心原因是用Azure Key Vault安全存储敏感配置(如数据库连接字符串、API密钥),通过Azure App Configuration的@Microsoft.KeyVault(SecretUri={SecretURL})语法可直接引用Key Vault中的机密。目前项目仅从appsettings.json加载配置,需要调整实现:非本地环境使用Azure App Configuration,本地运行时仍沿用appsettings.json。
原有代码参考
ConfigurationExtensions类
public static class ConfigurationExtensions { public static IConfigurationBuilder AddAppConfiguration(this IConfigurationBuilder configurationBuilder, IWebHostEnvironment hostingEnvironment) { configurationBuilder .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); // For Localhost, we're using appsettings.json file, it will not be overridden when running on Localhost if (!hostingEnvironment.IsEnvironment("Localhost")) { configurationBuilder.AddJsonFile($"appsettings.{hostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true); } configurationBuilder.AddEnvironmentVariables(); return configurationBuilder; } }
Program.cs代码
var builder = WebApplication.CreateBuilder(args); { // Environment configuration var configuration = builder.Configuration; var env = builder.Environment; configuration.AddAppConfiguration(env); builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblyContaining<Program>()); builder.Services.AddHttpClient(); builder.Services.AddApplication(); builder.Services.AddInfrastructure(builder.Configuration); builder.Services.AddHelpers(); builder.Services.AddControllers() // Configures the JSON serialization options for controllers. .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNamingPolicy = null; }); builder.Services.Configure<ApiBehaviorOptions>(options => { options.SuppressModelStateInvalidFilter = true; }); } var app = builder.Build(); { app.UseHttpsRedirection(); // Authentication & Authorization app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.UseRouting(); app.UseSwaggerWithVersioning(); } if (app.Environment.IsDevelopment()) { //DEV configurations } app.Run();
修改步骤
1. 安装依赖NuGet包
需要添加Azure App Configuration和身份验证相关的包:
Install-Package Microsoft.Extensions.Configuration.AzureAppConfiguration Install-Package Azure.Identity
Azure.Identity用于自动处理身份验证:部署到Azure时使用托管标识,本地开发时自动适配Azure CLI、Visual Studio等已登录的身份。
2. 更新ConfigurationExtensions类
修改配置扩展方法,在非本地环境加入Azure App Configuration加载逻辑,同时保留本地的appsettings.json使用:
public static class ConfigurationExtensions { public static IConfigurationBuilder AddAppConfiguration(this IConfigurationBuilder configurationBuilder, IWebHostEnvironment hostingEnvironment) { // 本地环境仅加载基础appsettings.json configurationBuilder .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); if (!hostingEnvironment.IsEnvironment("Localhost")) { // 非本地环境加载对应环境的配置文件 configurationBuilder.AddJsonFile($"appsettings.{hostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true); // 从已加载的配置中读取Azure App Configuration连接字符串 var config = configurationBuilder.Build(); var appConfigConnString = config.GetConnectionString("AzureAppConfiguration"); // 添加Azure App Configuration支持,并启用Key Vault引用解析 configurationBuilder.AddAzureAppConfiguration(options => { options.Connect(appConfigConnString) .ConfigureKeyVault(kvOptions => { kvOptions.SetCredential(new DefaultAzureCredential()); }); }); } configurationBuilder.AddEnvironmentVariables(); return configurationBuilder; } }
3. 配置Azure App Configuration连接字符串
在非本地环境的配置文件(如appsettings.Production.json)中添加连接字符串,避免硬编码:
{ "ConnectionStrings": { "AzureAppConfiguration": "你的Azure App Configuration实例连接字符串" } }
本地环境的appsettings.json无需添加此配置,因为本地不会触发Azure App Configuration的加载。
4. Azure部署权限配置
- 给部署的Azure服务(如App Service)启用系统分配托管标识
- 给该托管标识分配Azure App Configuration的"数据读取者"角色,以及Key Vault的"机密读取者"角色,确保能正常读取配置和解析Key Vault引用
验证逻辑
- 本地运行(环境为"Localhost"):仅加载appsettings.json,保持原有开发流程
- Azure环境运行:先加载对应环境的appsettings文件,再从Azure App Configuration读取配置,并自动解析Key Vault中的机密引用
内容的提问来源于stack exchange,提问作者Rakesh Kumar
相关产品推荐
相关产品推荐

