在 .NET 开发中,管理 Secret(如 API Key、数据库密码)和环境变量是必备技能。结合你日常在 Visual Studio 中构建 .NET 项目、Docker 集成发布以及 Linux 服务器部署的场景,以下是完整配置教程:
一、开发环境:使用 Secret Manager(用户机密)
开发阶段绝对不要把敏感信息硬编码在代码里或提交到 Git,推荐使用 .NET 自带的 Secret Manager 工具。
1. 初始化用户机密
在 Visual Studio 中右键点击项目,选择 "管理用户机密",会自动在 .csproj 中生成 UserSecretsId。或者在项目根目录执行命令:
dotnet user-secrets init2. 添加/设置机密
使用 CLI 命令设置键值对(支持冒号 : 表示层级结构):
机密实际存储在本地 JSON 文件中(Windows 路径:%APPDATA%\Microsoft\UserSecrets\<UserSecretsId>\secrets.json),完全脱离项目目录,不会被 Git 追踪。
var builder = WebApplication.CreateBuilder(args);
var openAIKey = builder.Configuration["OpenAI:ApiKey"];
var dbPassword = builder.Configuration["Database:Password"];优先级:User Secrets > appsettings.json,同名配置会自动覆盖。
二、环境变量配置
Linux/macOS(当前会话):
export ASPNETCORE_ENVIRONMENT=Production
export DB_CONNECTION_STRING="Server=localhost;Database=MyDB;User=sa;Password=P@ssw0rd;"Docker(docker run 或 Dockerfile):
- bash编辑
- docker run -e ASPNETCORE_ENVIRONMENT=Production -e DB_CONNECTION_STRING="..." myappdockerfile编辑ENV ASPNETCORE_ENVIRONMENT=Production
- Kubernetes:在 Deployment YAML 的 env 字段中定义。
2. 代码中读取环境变量
var builder = WebApplication.CreateBuilder(args);
// WebApplication.CreateBuilder 默认已加载环境变量
var env = builder.Configuration["ASPNETCORE_ENVIRONMENT"];
var connStr = builder.Configuration["DB_CONNECTION_STRING"];注意:环境变量中的层级键需用双下划线 __ 代替冒号(如 OpenAI__ApiKey),框架会自动转换。
三、环境判断与配置加载优先级
1. 环境判断
ASP.NET Core 通过 ASPNETCORE_ENVIRONMENT 或 DOTNET_ENVIRONMENT 环境变量判断当前环境,框架预置了三个值:Development、Staging、Production(未设置时默认为 Production)。
代码中判断环境:
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}2. 配置加载优先级(从高到低)
- 命令行参数
- 环境变量
- User Secrets(仅
Development环境) appsettings.{Environment}.json(如appsettings.Production.json)appsettings.json
四、生产环境最佳实践
- Linux 服务器部署:通过 Supervisor 管理 .NET 进程时,在 Supervisor 配置文件的
environment字段中注入环境变量,实现配置与代码分离。 - 云/容器部署:部署到 Azure App Service、Docker、K8s 时,直接使用平台提供的环境变量或密钥管理服务(如 Azure Key Vault),无需修改代码。
- CI/CD:在流水线中通过 Secret 注入环境变量,避免密钥进入代码库。
- 永远不要将
secrets.json或包含真实密钥的appsettings.json提交到 Git。建议在.gitignore中添加appsettings.Development.json,并在appsettings.json中保留占位值提示其他开发者。

