Dotnet User-Secrets В Asp.Net Core

Скачать

🔐 appsettings.json + dotnet user-secrets в ASP.NET Core

🧩 Общая концепция

ASP.NET Core использует многоуровневую конфигурацию. Это значит, что ты можешь комбинировать разные источники конфигурации:

🔢 Приоритет (от низшего к высшему):

  1. appsettings.json
  2. appsettings.{Environment}.json
  3. Secret Manager (dotnet user-secrets)
  4. Переменные окружения
  5. Аргументы командной строки

То есть, 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, и легко настраивается
  • Безопасен, гибок и идеально подходит для разработки