Конфигурация: appsettings, окружения, переменные, секреты
↑ 3.1 Хост, конфигурация и middleware pipeline · ← Предыдущая · → Следующая
Зачем это на собесе
Спрашивают приоритет источников, как хранить секреты и как переопределять настройки в Docker/Kubernetes.
Объяснение
IConfiguration объединяет несколько провайдеров в один ключ-значение. Поздние источники переопределяют ранние.
| Порядок (по умолчанию) | Источник |
|---|---|
| 1 | appsettings.json |
| 2 | appsettings.{Environment}.json |
| 3 | User Secrets (только Development) |
| 4 | Переменные окружения |
| 5 | Аргументы командной строки |
Иерархия ключей разделяется двоеточием: ConnectionStrings:Default. В переменных окружения используют двойное подчёркивание: ConnectionStrings__Default.
{
"ConnectionStrings": { "Default": "Host=localhost;Database=app" },
"Kafka": { "Brokers": ["k1:9092", "k2:9092"] }
}var cs = builder.Configuration.GetConnectionString("Default");
var brokers = builder.Configuration.GetSection("Kafka:Brokers").Get<string[]>();Окружения
ASPNETCORE_ENVIRONMENT (Development / Staging / Production) выбирает appsettings.{env}.json и поведение (app.Environment.IsDevelopment()), например страницу ошибок разработчика.
Секреты
- Локально:
dotnet user-secrets set "Jwt:Key" "..."— хранится вне репозитория. - Прод: переменные окружения, Kubernetes Secrets, Azure Key Vault, HashiCorp Vault, AWS Secrets Manager (провайдеры конфигурации).
- Никогда: секреты в репозитории или в образе Docker.
Нюансы и подводные камни
- Значения из переменных окружения всегда строки; массивы задаются индексами:
Kafka__Brokers__0. - Конфигурация в целом не типизирована: для использования в коде применяйте Options (см. Options pattern: IOptions, IOptionsSnapshot, IOptionsMonitor, валидация).
- Изменения файлов подхватываются (
reloadOnChange), но значения, уже прочитанные в singleton-е, не обновятся автоматически. - Опечатка в ключе даёт
nullбез ошибки: используйте валидацию Options при старте. launchSettings.jsonработает только при запуске из IDE/dotnet run, не в Docker.
Практика
- Переопределите строку подключения переменной окружения в
docker run. - Настройте User Secrets для JWT-ключа и убедитесь, что он не попал в git.
- Подключите Azure Key Vault или Vault-провайдер в тестовом окружении.
Вопросы с ответами
Каков порядок приоритета источников конфигурации?
appsettings → appsettings.{env} → user secrets → переменные окружения → командная строка; последний побеждает.
Как безопасно хранить секреты?
Вне репозитория: user-secrets локально, секрет-хранилище и переменные окружения в проде, доступ по принципу наименьших прав.
Как задать вложенный ключ в переменной окружения?
Заменить двоеточие на двойное подчёркивание:
Section__Key.