Gestion des secrets
Stockez les secrets en toute sécurité avec .NET User Secrets en développement, puis Azure Key Vault ou des variables d’environnement en production.
Gestion des secrets est une leçon C# Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C# Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C# Academy comprend 4 leçons au total.
Les secrets ne sont pas de la configuration
Les mots de passe, les clés d’API, les chaînes de connexion et les clés de signature JWT ne doivent jamais être stockés dans appsettings.json ni ajoutés au contrôle du code source. .NET fournit plusieurs mécanismes dédiés à la gestion des secrets.
Secrets utilisateur (développement)
Les secrets utilisateur de développement sont stockés en dehors du répertoire du projet, dans un fichier local à la machine. Ils sont chargés automatiquement dans l’environnement de développement et ne sont jamais inclus avec le code source.
# Initialize (adds UserSecretsId to .csproj):
dotnet user-secrets init
# Set secrets:
dotnet user-secrets set "Database:Password" "dev-pass-123"
dotnet user-secrets set "Jwt:SigningKey" "dev-jwt-key-abc"
dotnet user-secrets set "OpenAI:ApiKey" "sk-..."
# List / remove:
dotnet user-secrets list
dotnet user-secrets remove "OpenAI:ApiKey"
# Stored at:
# macOS/Linux: ~/.microsoft/usersecrets/{id}/secrets.json
# Windows: %APPDATA%\Microsoft\UserSecrets\{id}\secrets.jsonCharger explicitement les secrets utilisateur
Host.CreateApplicationBuilder charge automatiquement les secrets utilisateur dans l’environnement de développement. Vous pouvez également les charger explicitement pour les scénarios hors développement ou les projets de test.
var builder = Host.CreateApplicationBuilder(args);
// Automatic (Development only) — already done by default
// Equivalent manual call:
if (builder.Environment.IsDevelopment())
builder.Configuration.AddUserSecrets<Program>();
// In test projects (no ASPNETCORE_ENVIRONMENT):
var config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: true)
.AddUserSecrets<Program>() // loads secrets.json
.AddEnvironmentVariables()
.Build();Variables d’environnement pour la production
En production, injectez les secrets sous forme de variables d’environnement — ils sont lus au moment de l’exécution depuis le système d’exploitation ou l’orchestrateur de conteneurs et ne sont jamais conservés sur le disque en clair à côté du code.
# docker-compose.yml — inject secrets:
services:
api:
image: myapp:latest
environment:
- Database__Password=${DB_PASSWORD} # from .env file
- Jwt__SigningKey=${JWT_KEY}
- ConnectionStrings__Default=Server=db;Password=${DB_PASSWORD}
# Kubernetes Secret:
kubectl create secret generic app-secrets \
--from-literal=Database__Password=secret123 \
--from-literal=Jwt__SigningKey=verylongkey
# Reference in pod spec:
# env:
# - name: Database__Password
# valueFrom:
# secretKeyRef: { name: app-secrets, key: Database__Password }Intégration avec Azure Key Vault
Azure Key Vault est un magasin de secrets géré destiné à la production. Le fournisseur officiel charge directement les secrets dans le système de configuration : votre application les lit comme n’importe quelle autre valeur de configuration.
// dotnet add package Azure.Extensions.AspNetCore.Configuration.Secrets
// dotnet add package Azure.Identity
var builder = WebApplication.CreateBuilder(args);
if (!builder.Environment.IsDevelopment())
{
var kvUri = new Uri(builder.Configuration["Azure:KeyVaultUri"]!);
// Uses Managed Identity / workload identity in production:
builder.Configuration.AddAzureKeyVault(kvUri, new DefaultAzureCredential());
}
// Secrets named "Database--Password" in Key Vault
// are accessible as builder.Configuration["Database:Password"]
// (Key Vault uses -- as the : separator)AWS Secrets Manager
Sur AWS, utilisez Amazon.Extensions.Configuration.SystemsManager ou Secrets Manager directement pour injecter les secrets dans la chaîne de configuration .NET.
// dotnet add package Amazon.Extensions.Configuration.SystemsManager
builder.Configuration.AddSystemsManager(
path: "/myapp/production", // parameter store prefix
optional: false,
reloadAfter: TimeSpan.FromMinutes(30));
// Or Secrets Manager directly:
using Amazon.SecretsManager;
using Amazon.SecretsManager.Model;
var client = new AmazonSecretsManagerClient();
var response = await client.GetSecretValueAsync(new GetSecretValueRequest
{
SecretId = "myapp/production/db-password"
});
var secret = response.SecretString; // JSON string
// Parse and inject into configHashiCorp Vault
HashiCorp Vault fournit des secrets dynamiques, la rotation des secrets et un contrôle d’accès précis. Utilisez la bibliothèque communautaire VaultSharp ou un fournisseur de configuration pour l’intégrer à .NET.
// dotnet add package VaultSharp
using VaultSharp;
using VaultSharp.V1.AuthMethods.Token;
var authMethod = new TokenAuthMethodInfo("vault-token");
var vaultClient = new VaultClient(
new VaultClientSettings("https://vault.example.com:8200", authMethod));
// Read a secret:
var kv = await vaultClient.V1.Secrets.KeyValue.V2
.ReadSecretAsync(path: "myapp/database", mountPoint: "secret");
var password = kv.Data.Data["password"].ToString();
// Then store in configuration or pass to IOptions:
builder.Configuration["Database:Password"] = password;Protéger les secrets en mémoire
Même en mémoire, les secrets doivent être manipulés avec précaution. Utilisez SecureString ou limitez leur portée avec des blocs using, et évitez de journaliser les valeurs des secrets.
// NEVER log secrets:
_logger.LogInformation("API Key: {Key}", apiKey); // WRONG!
_logger.LogInformation("API Key configured: {HasKey}", !string.IsNullOrEmpty(apiKey)); // CORRECT
// Mask in diagnostics:
public string KeyHint => apiKey.Length > 8
? $"{apiKey[..4]}...{apiKey[^4..]}"
: "****";
// Scope the secret:
void ProcessWithSecret()
{
var secret = LoadSecret();
try { UseSecret(secret); }
finally { secret = string.Empty; } // clear reference
}Secrets dans les chaînes CI/CD
Les chaînes CI/CD (GitHub Actions, Azure DevOps, Jenkins) fournissent des magasins de variables secrètes. Injectez les secrets sous forme de variables d’environnement au moment de la compilation ou du déploiement — ne les inscrivez jamais en dur dans le fichier YAML de la chaîne.
# GitHub Actions — store in Settings > Secrets:
# name: Deploy
# on: push
# jobs:
# deploy:
# runs-on: ubuntu-latest
# env:
# Database__Password: ${{ secrets.DB_PASSWORD }}
# Jwt__SigningKey: ${{ secrets.JWT_KEY }}
# steps:
# - name: Run migration
# run: dotnet ef database update
# Azure Pipelines:
# variables:
# - group: my-app-secrets # from Azure DevOps Variable Group
# The secrets are masked in logs and never stored in plaintextEn pratique : stratégie de secrets pour le développement et la production
Une stratégie complète de gestion des secrets : secrets utilisateur en développement, Azure Key Vault en production, avec les variables d’environnement comme solution de repli.
var builder = WebApplication.CreateBuilder(args);
if (builder.Environment.IsDevelopment())
{
// Dev: local secrets.json, never committed
builder.Configuration.AddUserSecrets<Program>();
}
else
{
// Production: Azure Key Vault via Managed Identity
var kvUri = builder.Configuration["Azure:KeyVaultUri"];
if (!string.IsNullOrEmpty(kvUri))
builder.Configuration.AddAzureKeyVault(
new Uri(kvUri), new DefaultAzureCredential());
}
// Always load env vars (works in all environments + containers):
// Already loaded by CreateBuilder — they override Key Vault
// Bind secrets to strongly typed options:
builder.Services
.AddOptions<JwtOptions>()
.BindConfiguration("Jwt")
.ValidateDataAnnotations()
.ValidateOnStart();Vérification rapide
Pourquoi les secrets ne doivent-ils jamais être stockés dans appsettings.json ?
Récapitulatif : gestion des secrets
Points clés à retenir :
- Ne stockez jamais les secrets dans
appsettings.json— ce fichier est ajouté au contrôle du code source - Développement : utilisez les secrets utilisateur (
dotnet user-secrets) — ils sont stockés en dehors du projet - Production : variables d’environnement, Azure Key Vault, AWS Secrets Manager ou HashiCorp Vault
- CI/CD : stockez les secrets dans le magasin de secrets de la chaîne et injectez-les comme variables d’environnement
- Ne journalisez jamais les valeurs brutes des secrets : utilisez des indications ou des masques
- Combinez les stratégies : secrets utilisateur en développement + Key Vault en production + variables d’environnement comme remplacement
Questions Fréquemment Posées
La leçon « Gestion des secrets » est-elle gratuite ?
Oui — le texte complet de « Gestion des secrets » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C# Academy, passe à CoddyKit PRO. Le cours C# Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Gestion des secrets » ?
Stockez les secrets en toute sécurité avec .NET User Secrets en développement, puis Azure Key Vault ou des variables d’environnement en production. Tu pratiques C# Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer C# Academy ?
Aucune expérience préalable n'est requise. C# Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.
Combien de temps prend la leçon « Gestion des secrets » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon C# Academy ?
Oui. Chaque leçon C# Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Sources et fournisseurs de configuration
- Options fortement typées avec IOptions
- Validation des options et options nommées
- Gestion des secrets