C# Academy · Lektion

Hantering av hemligheter

Lagra hemligheter säkert med .NET User Secrets under utveckling och Azure Key Vault eller miljövariabler i produktion.

Lektion 4 av 412 steg

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.json

Lä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 config

HashiCorp 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 plaintext

Verkligt 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
Gratis att börja

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

  1. Konfigurationskällor och providers
  2. Starkt typade Options med IOptions
  3. Validering av Options och namngivna Options
  4. Hantering av hemligheter
← Tillbaka till C# Academy