Belajar .NET - Security & Identity
Series/Belajar .NET/Episode 12
Episode 12 of 23

Belajar .NET - Security & Identity

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.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

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 dan Otorisasi

Dua Konsep yang Berbeda

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.

Aktifkan autentikasi dan otorisasi
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 Bearer Tokens

Mengonfigurasi JWT Bearer

JWT adalah token terenkripsi yang membawa klaim pengguna. Aktifkan dengan paket JwtBearer:

Install JwtBearer
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

Lalu daftarkan skema bearer di Program.cs:

Konfigurasi JWT bearer
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.

Mengeluarkan Token

Token diterbitkan oleh penyedia identitas, bukan oleh API biasa. Alur dasarnya:

  1. Klien login ke penyedia identitas.
  2. Penyedia mengeluarkan JWT yang berisi klaim.
  3. Klien mengirim JWT di header Authorization: Bearer <token>.
  4. API memvalidasi dan membaca klaim pengguna.

API hanya mengecek keabsahan token dan tidak pernah membocorkan rahasia penandatanganannya.

Policy-Based Authorization

Policy dari Klaim

Policy memungkinkan aturan otorisasi dinamis berdasarkan klaim:

Daftarkan policy
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.

Requirement Custom

Untuk logika otorisasi kompleks, buat requirement khusus:

Custom requirement
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 dan OpenID Connect

Standar Industri

OAuth2 mengatur pemberian akses (authorization), sedangkan OpenID Connect menambah lapisan identitas di atasnya. ASP.NET Core mendukung keduanya secara native:

Integrasi OpenID Connect
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.

Secure Headers, CORS, dan Data Protection

Header Keamanan dan CORS

Respons HTTP harus membawa header keamanan. Aktifkan HTTPS redirect dan atur CORS secara eksplisit:

HTTPS dan CORS
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

Data Protection API mengenkripsi data sensitif seperti cookie dan token sementara:

Encrypt dengan Data Protection
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.

Ringkasan Praktik Keamanan

  • Pasang UseAuthentication sebelum UseAuthorization.
  • Pakai JWT bearer dengan Authority dan Audience yang tepat.
  • Definisikan policy dari klaim; custom requirement untuk logika kompleks.
  • Integrasikan OpenID Connect untuk penyedia identitas eksternal.
  • Terapkan HSTS, HTTPS redirect, dan CORS yang ketat.
  • Enkripsi data sensitif dengan Data Protection API.

Penutup

Inti yang harus dibawa pulang:

  • Autentikasi memverifikasi identitas; otorisasi mengatur hak akses.
  • JWT bearer memvalidasi token lewat Authority dan Audience.
  • Policy-based authorization membaca klaim untuk membatasi endpoint.
  • OAuth2 dan OpenID Connect mengalihkan identitas ke penyedia eksternal.
  • Secure headers, CORS, dan HTTPS adalah dasar perlindungan transport.
  • Data Protection API melindungi data sensitif di aplikasi.

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.

Belajar .NET - Security & Identity | Belajar .NET