Конфигурация: appsettings, окружения, переменные, секреты

↑ 3.1 Хост, конфигурация и middleware pipeline · ← Предыдущая · → Следующая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Спрашивают приоритет источников, как хранить секреты и как переопределять настройки в Docker/Kubernetes.

Объяснение

IConfiguration объединяет несколько провайдеров в один ключ-значение. Поздние источники переопределяют ранние.

Порядок (по умолчанию)Источник
1appsettings.json
2appsettings.{Environment}.json
3User 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.

Практика

  1. Переопределите строку подключения переменной окружения в docker run.
  2. Настройте User Secrets для JWT-ключа и убедитесь, что он не попал в git.
  3. Подключите Azure Key Vault или Vault-провайдер в тестовом окружении.

Вопросы с ответами

Связанные темы