1. Pengantar API RESTful dan Keamanan
API RESTful adalah sebuah arsitektur yang memungkinkan aplikasi berkomunikasi melalui protokol HTTP dengan menggunakan metode standar seperti GET, POST, PUT, dan DELETE. Keamanan API sangat penting untuk melindungi data dan mencegah akses tidak sah.
Dalam panduan ini, kita akan membangun API RESTful menggunakan .NET 7 dengan fokus pada praktik keamanan terbaik seperti autentikasi JWT, otorisasi berbasis peran, validasi input, dan pengelolaan error.
2. Persiapan Lingkungan dan Tools
Sebelum mulai coding, pastikan Anda sudah menyiapkan beberapa tools berikut:
-
.NET 7 SDK
- Unduh dan install dari
situs resmi .NET
.
-
Visual Studio 2022
atau
Visual Studio Code
dengan ekstensi C#.
-
Postman
untuk pengujian API.
-
SQL Server
atau database lain yang didukung Entity Framework Core.
3. Membuat Proyek API RESTful dengan .NET 7
Buka terminal atau command prompt, lalu jalankan perintah berikut untuk membuat proyek Web API baru:
dotnet new webapi -n SecureApiDotNet7
cd SecureApiDotNet7
Perintah ini akan membuat folder
SecureApiDotNet7
dengan template API Web yang sudah siap digunakan.
4. Memahami Struktur Proyek
Setelah membuat proyek, berikut adalah struktur folder dan file utama yang perlu Anda ketahui:
-
Program.cs
- Titik masuk aplikasi, konfigurasi layanan dan middleware.
-
Controllers/
- Folder untuk menyimpan controller API.
-
appsettings.json
- File konfigurasi aplikasi, termasuk connection string.
-
Properties/launchSettings.json
- Pengaturan debug dan profil aplikasi.
5. Membuat Endpoint CRUD Sederhana
Buat controller baru bernama
ProductsController.cs
di folder
Controllers
dengan kode berikut:
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
namespace SecureApiDotNet7.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
private static readonly List<Product> Products = new()
{
new Product { Id = 1, Name = "Laptop", Price = 15000000 },
new Product { Id = 2, Name = "Smartphone", Price = 7000000 }
};
[HttpGet]
public IEnumerable<Product> Get() => Products;
[HttpGet("{id}")]
public ActionResult<Product> Get(int id)
{
var product = Products.Find(p => p.Id == id);
if (product == null) return NotFound();
return product;
}
[HttpPost]
public ActionResult<Product> Post(Product product)
{
product.Id = Products.Count + 1;
Products.Add(product);
return CreatedAtAction(nameof(Get), new { id = product.Id }, product);
}
[HttpPut("{id}")]
public IActionResult Put(int id, Product updatedProduct)
{
var product = Products.Find(p => p.Id == id);
if (product == null) return NotFound();
product.Name = updatedProduct.Name;
product.Price = updatedProduct.Price;
return NoContent();
}
[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
var product = Products.Find(p => p.Id == id);
if (product == null) return NotFound();
Products.Remove(product);
return NoContent();
}
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
}
Endpoint ini menyediakan operasi CRUD sederhana untuk produk. Anda bisa menguji endpoint ini menggunakan Postman.
6. Menambahkan Database dengan Entity Framework Core
Tambahkan paket NuGet berikut:
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
Buat folder
Data
dan buat kelas
AppDbContext.cs
:
using Microsoft.EntityFrameworkCore;
using SecureApiDotNet7.Controllers;
namespace SecureApiDotNet7.Data
{
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
public DbSet<Product> Products { get; set; }
}
}
Tambahkan konfigurasi di
Program.cs
untuk menggunakan SQL Server:
using Microsoft.EntityFrameworkCore;
using SecureApiDotNet7.Data;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
Tambahkan connection string di
appsettings.json
:
{
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=SecureApiDb;Trusted_Connection=True;MultipleActiveResultSets=true"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
Jalankan migrasi database:
dotnet ef migrations add InitialCreate
dotnet ef database update
7. Menambahkan Autentikasi JWT
Tambahkan paket NuGet berikut untuk JWT:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
Tambahkan konfigurasi JWT di
Program.cs
:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
var builder = WebApplication.CreateBuilder(args);
var key = Encoding.ASCII.GetBytes("IniRahasiaSuperPanjangDanKuat123!");
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.RequireHttpsMetadata = false;
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(key),
ValidateIssuer = false,
ValidateAudience = false
};
});
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
Buat controller
AuthController.cs
untuk login dan mendapatkan token JWT:
using Microsoft.AspNetCore.Mvc;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
namespace SecureApiDotNet7.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
private readonly string _key = "IniRahasiaSuperPanjangDanKuat123!";
[HttpPost("login")]
public IActionResult Login([FromBody] LoginModel login)
{
if (login.Username == "admin" && login.Password == "password")
{
var tokenHandler = new JwtSecurityTokenHandler();
var key = Encoding.ASCII.GetBytes(_key);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Name, login.Username),
new Claim(ClaimTypes.Role, "Admin")
}),
Expires = DateTime.UtcNow.AddHours(1),
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
};
var token = tokenHandler.CreateToken(tokenDescriptor);
var tokenString = tokenHandler.WriteToken(token);
return Ok(new { Token = tokenString });
}
return Unauthorized();
}
}
public class LoginModel
{
public string Username { get; set; }
public string Password { get; set; }
}
}
Sekarang Anda bisa login dengan username
admin
dan password
password
untuk mendapatkan token JWT.
8. Menambahkan Otorisasi Role-Based
Tambahkan atribut
[Authorize]
dan role pada controller atau endpoint yang ingin diamankan. Contoh modifikasi
ProductsController
:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Collections.Generic;
namespace SecureApiDotNet7.Controllers
{
[ApiController]
[Route("api/[controller]")]
[Authorize(Roles = "Admin")]
public class ProductsController : ControllerBase
{
private static readonly List<Product> Products = new()
{
new Product { Id = 1, Name = "Laptop", Price = 15000000 },
new Product { Id = 2, Name = "Smartphone", Price = 7000000 }
};
[HttpGet]
public IEnumerable<Product> Get() => Products;
[HttpGet("{id}")]
public ActionResult<Product> Get(int id)
{
var product = Products.Find(p => p.Id == id);
if (product == null) return NotFound();
return product;
}
[HttpPost]
public ActionResult<Product> Post(Product product)
{
product.Id = Products.Count + 1;
Products.Add(product);
return CreatedAtAction(nameof(Get), new { id = product.Id }, product);
}
[HttpPut("{id}")]
public IActionResult Put(int id, Product updatedProduct)
{
var product = Products.Find(p => p.Id == id);
if (product == null) return NotFound();
product.Name = updatedProduct.Name;
product.Price = updatedProduct.Price;
return NoContent();
}
[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
var product = Products.Find(p => p.Id == id);
if (product == null) return NotFound();
Products.Remove(product);
return NoContent();
}
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
}
Dengan ini, hanya user dengan role
Admin
yang bisa mengakses endpoint produk.
9. Validasi Input dan Error Handling
Gunakan data annotation untuk validasi model. Contoh modifikasi kelas
Product
:
using System.ComponentModel.DataAnnotations;
public class Product
{
public int Id { get; set; }
[Required(ErrorMessage = "Nama produk wajib diisi")]
[StringLength(100, ErrorMessage = "Nama produk maksimal 100 karakter")]
public string Name { get; set; }
[Range(1, double.MaxValue, ErrorMessage = "Harga harus lebih besar dari 0")]
public decimal Price { get; set; }
}
Tambahkan pengecekan validasi di controller:
[HttpPost]
public ActionResult<Product> Post([FromBody] Product product)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
product.Id = Products.Count + 1;
Products.Add(product);
return CreatedAtAction(nameof(Get), new { id = product.Id }, product);
}
Ini akan memastikan data yang masuk valid dan memberikan pesan error yang jelas jika tidak.
10. Pengujian API dengan Postman dan Swagger
.NET 7 sudah menyediakan Swagger UI secara default untuk dokumentasi dan pengujian API. Jalankan aplikasi dan buka
https://localhost:{port}/swagger
untuk melihat dokumentasi interaktif.
Gunakan Postman untuk mengirim request GET, POST, PUT, DELETE dan menguji autentikasi JWT dengan menambahkan header
Authorization: Bearer <token>
.
11. Deployment API ke Azure atau Server Lain
Anda bisa melakukan deployment API ke berbagai platform, salah satunya Azure App Service. Berikut langkah singkatnya:
-
Build aplikasi dengan perintah
dotnet publish -c Release
.
-
Buat App Service di portal Azure dan konfigurasi deployment.
-
Upload hasil publish ke App Service menggunakan FTP, Git, atau Azure DevOps.
-
Set environment variables dan connection string di konfigurasi App Service.
-
Jalankan dan tes API di URL Azure yang disediakan.
12. Sumber Belajar dan Referensi Tambahan
Berikut beberapa sumber belajar yang sangat membantu untuk memperdalam pembuatan API RESTful dengan .NET 7 dan keamanan: