Pengelolaan Rahasia
Simpan rahasia dengan aman menggunakan .NET User Secrets saat pengembangan, serta Azure Key Vault atau variabel lingkungan saat produksi.
Pengelolaan Rahasia adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 4 pelajaran total.
Rahasia Bukan Konfigurasi
Kata sandi, kunci API, string koneksi, dan kunci penandatanganan JWT tidak boleh disimpan dalam appsettings.json atau dikomit ke kendali sumber. .NET menyediakan beberapa mekanisme khusus untuk pengelolaan rahasia.
User Secrets (Pengembangan)
User Secrets menyimpan rahasia pengembangan di luar direktori proyek dalam berkas lokal mesin. Data ini dimuat secara otomatis dalam lingkungan Development dan tidak pernah ikut bersama kode sumber.
# 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.jsonMemuat User Secrets Secara Eksplisit
Host.CreateApplicationBuilder secara otomatis memuat User Secrets dalam Development. Anda juga dapat memuatnya secara eksplisit untuk skenario non-Development atau proyek pengujian.
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();Variabel Lingkungan untuk Produksi
Dalam produksi, masukkan rahasia sebagai variabel lingkungan — variabel tersebut dibaca dari OS atau orkestrator kontainer saat program berjalan dan tidak pernah disimpan ke disk dalam teks biasa bersama kode.
# 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 }Integrasi Azure Key Vault
Azure Key Vault adalah penyimpanan rahasia terkelola untuk produksi. Penyedia resminya memuat rahasia langsung ke sistem konfigurasi — aplikasi Anda membacanya seperti nilai konfigurasi lainnya.
// 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
Di AWS, gunakan Amazon.Extensions.Configuration.SystemsManager atau Secrets Manager secara langsung untuk memasukkan rahasia ke alur konfigurasi .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 menyediakan rahasia dinamis, rotasi rahasia, dan kontrol akses terperinci. Gunakan pustaka komunitas VaultSharp atau penyedia konfigurasi untuk mengintegrasikannya dengan .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;Melindungi Rahasia dalam Memori
Bahkan dalam memori, rahasia harus ditangani dengan hati-hati. Gunakan SecureString atau batasi cakupan dengan blok using, dan hindari mencatat nilai rahasia.
// 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
}Rahasia dalam CI/CD
Alur CI/CD (GitHub Actions, Azure DevOps, Jenkins) menyediakan penyimpanan variabel rahasia. Masukkan rahasia sebagai variabel lingkungan saat membangun atau menerapkan — jangan pernah menanamkannya langsung dalam YAML alur.
# 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 plaintextPenerapan di Dunia Nyata: Strategi Rahasia Pengembangan/Produksi
Strategi rahasia yang lengkap: User Secrets dalam pengembangan, Azure Key Vault dalam produksi, dengan variabel lingkungan sebagai cadangan.
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();Pemeriksaan Singkat
Mengapa rahasia tidak boleh disimpan dalam appsettings.json?
Ringkasan: Pengelolaan Rahasia
Poin penting:
- Jangan pernah menyimpan rahasia dalam
appsettings.json— berkas ini dikomit ke kendali sumber - Pengembangan: gunakan User Secrets (
dotnet user-secrets) — disimpan di luar proyek - Produksi: variabel lingkungan, Azure Key Vault, AWS Secrets Manager, atau HashiCorp Vault
- CI/CD: simpan rahasia di penyimpanan rahasia alur, lalu masukkan sebagai variabel lingkungan
- Jangan pernah mencatat nilai rahasia mentah; gunakan petunjuk atau penyamaran
- Gabungkan strategi: User Secrets dalam pengembangan + Key Vault dalam produksi + variabel lingkungan sebagai override
Belajar C# dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 93
- Pelajaran
- 346
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pengelolaan Rahasia” gratis?
Ya — teks lengkap “Pengelolaan Rahasia” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Pengelolaan Rahasia”?
Simpan rahasia dengan aman menggunakan .NET User Secrets saat pengembangan, serta Azure Key Vault atau variabel lingkungan saat produksi. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C# Academy?
Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Pengelolaan Rahasia” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?
Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Sumber & Penyedia Konfigurasi
- Options Bertipe Kuat dengan IOptions
- Validasi Options & Options Bernama
- Pengelolaan Rahasia