Episode ini mengamankan aplikasi ASP.NET Core: ASP.NET Core Identity untuk manajemen pengguna, pipeline authentication, JWT authentication dan authorization policies, integrasi OAuth2 dan OpenID Connect, serta secure headers, CORS, dan pengelolaan token.

API yang terbuka tanpa keamanan adalah undangan untuk diserang. Setiap aplikasi nyata harus tahu siapa penggunanya (authentication), apa yang boleh dilakukan pengguna tersebut (authorization), dan bagaimana cara menjaga identitasnya tetap aman.
ASP.NET Core menyediakan fondasi keamanan yang lengkap: Identity untuk manajemen pengguna, middleware authentication yang pluggable, dan dukungan JWT serta OAuth2/OpenID Connect.
Episode 12 ini membangun lapisan keamanan secara bertahap: Identity, JWT, authorization policies, integrasi OAuth2, serta secure headers dan CORS.
ASP.NET Core Identity menangani pengguna, password hashing, roles, dan claims dengan penyimpanan di EF Core. Tambahkan package dan daftarkan layanannya:
dotnet add src/Toko.Api package Microsoft.AspNetCore.Identity.EntityFrameworkCorevar builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<TokoContext>(o =>
o.UseSqlite("Data Source=toko.db"));
builder.Services.AddIdentityApiEndpoints<IdentityUser>()
.AddEntityFrameworkStores<TokoContext>();
var app = builder.Build();
app.MapIdentityApi<IdentityUser>();
app.Run();AddIdentityApiEndpoints menyediakan endpoint standar seperti register dan login. Pipeline authentication bekerja sebagai middleware: setiap request diberi identitas dari token atau cookie, lalu kebijakan authorization memutuskan apakah request diteruskan.
Untuk API yang dikonsumsi aplikasi mobile atau SPA, JWT adalah pilihan utama. Token JWT adalah string yang ditandatangani berisi claims pengguna:
dotnet add src/Toko.Api package Microsoft.AspNetCore.Authentication.JwtBearerbuilder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = "https://id.contoh.id";
options.Audience = "toko-api";
});
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("AdminOnly", policy =>
policy.RequireRole("Admin"));
});AddJwtBearer memvalidasi signature dan klaim token pada setiap request. Kebijakan AdminOnly memastikan hanya pengguna dengan peran Admin yang bisa mengakses endpoint tertentu.
Terapkan kebijakan dengan attribute di controller atau action:
[ApiController]
[Route("api/admin")]
public class AdminController : ControllerBase
{
[HttpGet]
[Authorize(Policy = "AdminOnly")]
public IActionResult Get() => Ok("Hanya admin yang bisa melihat ini.");
[HttpDelete]
[Authorize]
public IActionResult Hapus() => Ok("Semua pengguna yang login boleh menghapus.");
}Attribute [Authorize] tanpa argumen cukup meminta pengguna login, sedangkan [Authorize(Policy = "AdminOnly")] meminta peran tertentu.
Untuk single sign-on dengan penyedia eksternal, daftarkan handler OpenID Connect atau OAuth:
builder.Services.AddAuthentication()
.AddOpenIdConnect("google", options =>
{
options.ClientId = "client-id-anda";
options.ClientSecret = "client-secret-anda";
options.Authority = "https://accounts.google.com";
options.ResponseType = "code";
options.Scope.Add("email");
});Dengan konfigurasi di atas, alur login mengikuti protokol OAuth2/OpenID Connect: aplikasi mengarahkan pengguna ke penyedia, menerima code, lalu menukarnya dengan token. Pattern ini menghindari pengelolaan password sendiri — baik dari sisi keamanan maupun pengalaman pengguna.
Browser menerapkan kebijakan keamanan lewat header HTTP. ASP.NET Core bisa menambahkan header keamanan secara otomatis:
app.UseHsts();
app.UseHttpsRedirection();
app.UseCors(policy => policy
.WithOrigins("https://app.contoh.id")
.AllowAnyHeader()
.AllowAnyMethod());UseHsts memberi tahu browser untuk selalu memakai HTTPS. Konfigurasi CORS di atas hanya mengizinkan asal https://app.contoh.id — jangan pernah memakai AllowAnyOrigin tanpa pertimbangan, karena itu membuka API kalian ke situs manapun.
JWT sebaiknya berumur pendek dan dilengkapi refresh token. Batasi masa berlaku dengan TokenValidationParameters dan selalu pindahkan token pada header Authorization, bukan di URL:
curl -H "Authorization: Bearer <token>" https://api.contoh.id/api/adminPerintah curl -H "Authorization: Bearer <token>" di atas mengirim token lewat header yang aman. Jangan pernah meletakkan token di query string — dia akan tercatat di log server dan history browser.
Inti yang harus dibawa pulang:
RequireRole memisahkan hak akses per endpoint.Di episode 13 selanjutnya kita memperdalam aspek keamanan dari sisi kode: secure coding dan best practices — input validation dan sanitasi, OWASP Top 10 untuk .NET, Data Protection API, serta pencegahan injection, XSS, CSRF, dan kebocoran data sensitif.