Geheimnisverwaltung
Speichern Sie Geheimnisse sicher mit .NET User Secrets während der Entwicklung und mit Azure Key Vault oder Umgebungsvariablen in der Produktion.
Geheimnisverwaltung ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Secrets gehören nicht in die Konfiguration
Passwörter, API-Schlüssel, Verbindungszeichenfolgen und JWT-Signaturschlüssel dürfen niemals in appsettings.json gespeichert oder in die Quellcodeverwaltung übernommen werden. .NET stellt mehrere speziell für die Verwaltung von Secrets vorgesehene Mechanismen bereit.
User Secrets (Entwicklung)
User Secrets speichern Secrets für die Entwicklung außerhalb des Projektverzeichnisses in einer lokalen Datei auf dem Rechner. Sie werden in der Development-Umgebung automatisch geladen und gelangen niemals zusammen mit dem Quellcode in Umlauf.
# 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.jsonUser Secrets explizit laden
Host.CreateApplicationBuilder lädt User Secrets in Development automatisch. Sie können sie auch für Szenarien außerhalb von Development oder für Testprojekte explizit laden.
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();Umgebungsvariablen für die Produktion
Fügen Sie Secrets in der Produktion als Umgebungsvariablen ein – sie werden zur Laufzeit vom Betriebssystem oder vom Container-Orchestrator gelesen und niemals zusammen mit dem Code als Klartext auf der Festplatte gespeichert.
# 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 }Integration von Azure Key Vault
Azure Key Vault ist ein verwalteter Secrets-Speicher für die Produktion. Der offizielle Provider lädt Secrets direkt in das Konfigurationssystem, sodass Ihre Anwendung sie wie jeden anderen Konfigurationswert liest.
// 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
Verwenden Sie unter AWS Amazon.Extensions.Configuration.SystemsManager oder direkt Secrets Manager, um Secrets in die .NET-Konfigurationspipeline einzufügen.
// 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 bietet dynamische Secrets, Secret-Rotation und eine fein abgestufte Zugriffskontrolle. Verwenden Sie die Community-Bibliothek VaultSharp oder einen Konfigurationsprovider zur Integration in .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;Secrets im Speicher schützen
Auch im Arbeitsspeicher sollten Secrets sorgfältig behandelt werden. Verwenden Sie SecureString, begrenzen Sie den Gültigkeitsbereich mit using-Blöcken und vermeiden Sie es, Secret-Werte zu protokollieren.
// 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 in CI/CD
CI/CD-Pipelines (GitHub Actions, Azure DevOps, Jenkins) stellen Speicher für Secret-Variablen bereit. Fügen Sie Secrets zum Zeitpunkt des Builds oder der Bereitstellung als Umgebungsvariablen ein – hardcodieren Sie sie niemals in Pipeline-YAML.
# 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 plaintextPraxisbeispiel: Dev-/Prod-Secret-Strategie
Eine vollständige Secret-Strategie: User Secrets in der Entwicklung, Azure Key Vault in der Produktion und Umgebungsvariablen als Fallback.
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();Schnelltest
Warum sollten Secrets niemals in appsettings.json gespeichert werden?
Zusammenfassung: Secret-Management
Wichtige Erkenntnisse:
- Speichern Sie niemals Secrets in
appsettings.json– die Datei wird in die Quellcodeverwaltung übernommen - Entwicklung: Verwenden Sie User Secrets (
dotnet user-secrets) – sie werden außerhalb des Projekts gespeichert - Produktion: Umgebungsvariablen, Azure Key Vault, AWS Secrets Manager oder HashiCorp Vault
- CI/CD: Speichern Sie Secrets im Secret-Speicher der Pipeline und fügen Sie sie als Umgebungsvariablen ein
- Protokollieren Sie niemals rohe Secret-Werte; verwenden Sie Hinweise oder Maskierungen
- Kombinieren Sie Strategien: User Secrets in der Entwicklung + Key Vault in der Produktion + Umgebungsvariablen als Überschreibung
Häufig gestellte Fragen
Ist die Lektion „Geheimnisverwaltung“ kostenlos?
Ja — der vollständige Text von „Geheimnisverwaltung“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Geheimnisverwaltung“?
Speichern Sie Geheimnisse sicher mit .NET User Secrets während der Entwicklung und mit Azure Key Vault oder Umgebungsvariablen in der Produktion. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C# Academy zu starten?
Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Geheimnisverwaltung“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?
Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Konfigurationsquellen und -anbieter
- Typsichere Optionen mit IOptions
- Optionsvalidierung und benannte Optionen
- Geheimnisverwaltung