🔐 appsettings.json
+ dotnet user-secrets
в ASP.NET Core
🧩 Общая концепция
ASP.NET Core использует многоуровневую конфигурацию. Это значит, что ты можешь комбинировать разные источники конфигурации:
🔢 Приоритет (от низшего к высшему):
appsettings.json
appsettings.{Environment}.json
- Secret Manager (
dotnet user-secrets
) - Переменные окружения
- Аргументы командной строки
То есть,
user-secrets
может переопределить значения изappsettings.json
, но сам будет переопределён переменными окружения, если они заданы.
📂 Что такое dotnet user-secrets
?
Это инструмент, который позволяет безопасно хранить чувствительные данные (ключи, токены, пароли) вне проекта — в зашифрованном хранилище пользователя.
🧪 Используется только в среде разработки и не попадает в git. Идеален для:
- API ключей
- Подключений к базам данных
- Конфиденциальных параметров
🛠️ Как подключить user-secrets
1. ✅ Добавь UserSecretsId в .csproj
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<UserSecretsId>myapp-3c2b6f1a</UserSecretsId>
</PropertyGroup>
UserSecretsId
— уникальный GUID или строка, которая определяет, где хранятся секреты. Visual Studio может сгенерировать его автоматически.
2. ⚙️ Установи секреты
В терминале из папки проекта:
dotnet user-secrets set "MySecrets:ApiKey" "super-secret-key"
Можно задать любое количество значений:
dotnet user-secrets set "ConnectionStrings:Postgres" "Host=localhost;Port=5432"
3. 🔄 Используй в Program.cs
Секреты подгружаются автоматически в CreateDefaultBuilder
, но можно явно указать:
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, config) =>
{
if (context.HostingEnvironment.IsDevelopment())
{
config.AddUserSecrets<Program>();
}
})
4. 📖 Чтение в коде
Через IConfiguration:
var apiKey = configuration["MySecrets:ApiKey"];
Через POCO + Bind:
public class MySecretsOptions
{
public string ApiKey { get; set; }
}
services.Configure<MySecretsOptions>(configuration.GetSection("MySecrets"));
🗃 Где хранятся секреты?
На Windows:
%APPDATA%\Microsoft\UserSecrets\<userSecretsId>\secrets.json
На Linux/macOS:
~/.microsoft/usersecrets/<userSecretsId>/secrets.json
Пример файла:
{
"MySecrets:ApiKey": "super-secret-key"
}
✅ Пример полной связки
appsettings.json
:
{
"MySecrets": {
"ApiKey": "dev-placeholder"
}
}
secrets.json
(автоматически подставляется):
{
"MySecrets:ApiKey": "real-key-from-secrets"
}
На запуске приложение прочитает ключ из
user-secrets
, если запущено вDevelopment
.
🧪 Проверка
Вывести секрет в лог:
logger.LogInformation("API Key: {ApiKey}", configuration["MySecrets:ApiKey"]);
🧠 Когда использовать user-secrets
?
Сценарий | Использовать? |
---|---|
Локальная разработка | ✅ Да |
Docker / CI / Production | ❌ Лучше ENV |
Хранение API-ключей, паролей, connection | ✅ Да |
GitHub, открытый проект | ✅ Обязательно |
🧼 Советы
- Не храни секреты в
appsettings.json
— только заглушки - Никогда не коммить
secrets.json
- Для продакшена используй ENV или
Azure Key Vault
🔚 Вывод
appsettings.json
— база конфигурацииuser-secrets
— удобный инструмент для хранения чувствительных данных локально- Работает в связке с
IConfiguration
, и легко настраивается - Безопасен, гибок и идеально подходит для разработки