Hantering av hemligheter
Lagra hemligheter säkert med .NET User Secrets under utveckling och Azure Key Vault eller miljövariabler i produktion.
Hantering av hemligheter är en gratis lektion i C# Academy på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C# Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C# Academy innehåller totalt 4 lektioner.
Hemligheter är inte konfiguration
Lösenord, API-nycklar, anslutningssträngar och JWT-signeringsnycklar får aldrig lagras i appsettings.json eller versionshanteras. .NET tillhandahåller flera särskilt avsedda mekanismer för hantering av hemligheter.
User Secrets (utveckling)
User Secrets lagrar utvecklingshemligheter utanför projektkatalogen i en lokal fil på datorn. De läses in automatiskt i miljön Development och följer aldrig med källkoden.
# 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.jsonLäs in User Secrets explicit
Host.CreateApplicationBuilder läser automatiskt in User Secrets i Development. Du kan också läsa in dem explicit i scenarier som inte använder Development eller i testprojekt.
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();Miljövariabler för produktion
I produktion injicerar du hemligheter som miljövariabler – de läses vid körning från operativsystemet eller containerorkestreraren och sparas aldrig i klartext på disk tillsammans med koden.
# 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 }Azure Key Vault-integration
Azure Key Vault är en hanterad lagring för hemligheter i produktion. Den officiella providern läser in hemligheter direkt i konfigurationssystemet – appen läser dem som vilket annat konfigurationsvärde som helst.
// 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
I AWS använder du Amazon.Extensions.Configuration.SystemsManager eller Secrets Manager direkt för att injicera hemligheter i .NETs konfigurationspipeline.
// 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 tillhandahåller dynamiska hemligheter, rotation av hemligheter och finkornig åtkomstkontroll. Använd community-biblioteket VaultSharp eller en konfigurationsprovider för att integrera med .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;Skydda hemligheter i minnet
Även i minnet ska hemligheter hanteras varsamt. Använd SecureString eller begränsa deras räckvidd med using-block, och undvik att logga hemlighetsvärden.
// 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
}Hemligheter i CI/CD
CI/CD-pipelines (GitHub Actions, Azure DevOps, Jenkins) tillhandahåller lagring för hemliga variabler. Injicera hemligheter som miljövariabler vid bygg- eller driftsättningstillfället – hårdkoda dem aldrig i 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 plaintextVerkligt exempel: Strategi för hemligheter i utveckling och produktion
En komplett strategi för hemligheter: User Secrets under utveckling, Azure Key Vault i produktion och miljövariabler som reservlösning.
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();Snabbkontroll
Varför ska hemligheter aldrig lagras i appsettings.json?
Sammanfattning: Hantering av hemligheter
Viktiga punkter:
- Lagra aldrig hemligheter i
appsettings.json– filen versionshanteras - Utveckling: använd User Secrets (
dotnet user-secrets) – de lagras utanför projektet - Produktion: miljövariabler, Azure Key Vault, AWS Secrets Manager eller HashiCorp Vault
- CI/CD: lagra hemligheter i pipelinens hemlighetslager och injicera dem som miljövariabler
- Logga aldrig råa hemlighetsvärden; använd ledtrådar eller maskering
- Kombinera strategier: User Secrets i utveckling + Key Vault i produktion + miljövariabler som överskrivning
Lär dig C# med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 93
- Lektioner
- 346
Vanliga frågor
Är lektionen ”Hantering av hemligheter” gratis?
Ja – hela texten till ”Hantering av hemligheter” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C# Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C# Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Hantering av hemligheter”?
Lagra hemligheter säkert med .NET User Secrets under utveckling och Azure Key Vault eller miljövariabler i produktion. Ni övar på C# Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig C# Academy?
Du behöver inga förkunskaper. Utbildningen i C# Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.
Hur lång tid tar lektionen ”Hantering av hemligheter”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här C# Academy-lektionen?
Ja. Varje C# Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Konfigurationskällor och providers
- Starkt typade Options med IOptions
- Validering av Options och namngivna Options
- Hantering av hemligheter