Episode ini mengajarkan keamanan di ASP.NET Core: autentikasi dan otorisasi, JWT bearer tokens, policy-based authorization, integrasi OAuth2 dan OpenID Connect, serta secure headers, CORS, dan data protection untuk melindungi aplikasi web.

Web API yang terbuka adalah undangan untuk disalahgunakan. Episode 12 mengajarkan lapisan keamanan di ASP.NET Core: autentikasi untuk memverifikasi siapa pengguna, dan otorisasi untuk menentukan apa yang boleh dia lakukan. Keduanya menjadi landasan setiap aplikasi production.
Kalian akan belajar JWT bearer tokens, policy-based authorization, integrasi dengan OAuth2 dan OpenID Connect, serta praktik perlindungan seperti secure headers, CORS, dan data protection. Ini adalah episode paling penting untuk membangun sistem yang dipercaya.
Autentikasi menjawab siapa kamu, otorisasi menjawab apa yang boleh kamu lakukan. Di ASP.NET Core keduanya adalah middleware terpisah yang bekerja berurutan. Autentikasi menetapkan identitas pengguna; otorisasi memeriksa klaim-nya.
app.UseAuthentication();
app.UseAuthorization();
app.MapGet("/api/admin", () => "rahasia")
.RequireAuthorization("AdminOnly");app.UseAuthentication() dan app.UseAuthorization() dipasang sebagai middleware. .RequireAuthorization("AdminOnly") membatasi endpoint berdasarkan policy — permintaan tanpa token yang sah akan ditolak dengan 401.
JWT adalah token terenkripsi yang membawa klaim pengguna. Aktifkan dengan paket JwtBearer:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearerLalu daftarkan skema bearer di Program.cs:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = builder.Configuration["Auth:Authority"];
options.Audience = builder.Configuration["Auth:Audience"];
options.TokenValidationParameters.ValidateIssuer = true;
});AddJwtBearer memvalidasi token JWT saat masuk. Authority menunjukkan penyedia token (misalnya IdentityServer atau Azure AD), dan Audience memastikan token memang ditujukan untuk API ini. Kunci publik dibawa oleh penyedia, jadi API tidak perlu menyimpan rahasia. Endpoint yang dilindungi cukup dipanggil dengan header Authorization: Bearer <token> di sisi klien.
Token diterbitkan oleh penyedia identitas, bukan oleh API biasa. Alur dasarnya:
Authorization: Bearer <token>.API hanya mengecek keabsahan token dan tidak pernah membocorkan rahasia penandatanganannya.
Policy memungkinkan aturan otorisasi dinamis berdasarkan klaim:
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("AdminOnly", policy =>
policy.RequireClaim("role", "admin"));
});AddPolicy("AdminOnly", ...) mendefinisikan aturan: pengguna harus punya klaim role dengan nilai admin. Endpoint yang memakai RequireAuthorization("AdminOnly") hanya bisa diakses pengguna dengan klaim tersebut.
Untuk logika otorisasi kompleks, buat requirement khusus:
public class UsiaMinimalRequirement : IAuthorizationRequirement
{
public int UmurMinimal { get; set; }
}Requirement diimplementasikan dalam handler yang mengevaluasi konteks pengguna. Ini memberi fleksibilitas penuh — misalnya memeriksa kepemilikan resource, bukan hanya role.
OAuth2 mengatur pemberian akses (authorization), sedangkan OpenID Connect menambah lapisan identitas di atasnya. ASP.NET Core mendukung keduanya secara native:
builder.Services.AddOpenIdConnect("oidc", options =>
{
options.Authority = builder.Configuration["Oidc:Authority"];
options.ClientId = builder.Configuration["Oidc:ClientId"];
options.ClientSecret = builder.Configuration["Oidc:ClientSecret"];
options.ResponseType = "code";
});AddOpenIdConnect memungkinkan aplikasi memakai penyedia eksternal — Azure AD, Auth0, Keycloak, atau IdentityServer. Pendekatan ini menghindarkan kalian dari menulis logika login, password hashing, dan session sendiri.
Respons HTTP harus membawa header keamanan. Aktifkan HTTPS redirect dan atur CORS secara eksplisit:
app.UseHsts();
app.UseHttpsRedirection();
app.UseCors(policy => policy
.WithOrigins("https://app.example.com")
.AllowAnyHeader()
.AllowAnyMethod());UseHsts memaksa browser memakai HTTPS, dan UseHttpsRedirection mengarahkan permintaan HTTP. CORS dengan .WithOrigins membatasi asal yang boleh mengakses API — jangan pakai AllowAnyOrigin di production kecuali memang diperlukan.
Data Protection API mengenkripsi data sensitif seperti cookie dan token sementara:
var protector = dataProtector.CreateProtector("Sensitive.v1");
string terenkripsi = protector.Protect("data rahasia");
string plain = protector.Unprotect(terenkripsi);CreateProtector menciptakan protektor dengan tujuan bernama, dan Protect/Unprotect mengenkripsi dan mendekripsi data. Kunci proteksi dikelola otomatis oleh runtime dan sebaiknya dipersistensikan agar token tetap valid saat aplikasi direstart.
Warning
Jangan pernah menyimpan password plaintext. Gunakan ASP.NET Core Identity atau library hashing yang mapan, dan jangan menuliskan secret di konfigurasi yang ikut ke Git.
Inti yang harus dibawa pulang:
Di episode 13 selanjutnya kita akan membahas secure coding practices — input validation dan output encoding, pencegahan injection, XSS, CSRF, dan kebocoran data sensitif, penyimpanan aman dengan Data Protection API, serta best practices keamanan production.