Panduan Lengkap Membangun API RESTful Aman dengan .NET 7

Temukan rahasia membangun API RESTful aman dengan .NET 7! Panduan lengkap ini menawarkan teknik terbaik dan tips praktis. Klik untuk mulai!

By WGS INDONESIA
4.9/4.9
Indonesia
Rp 43,750.00 GRATIS
E-COURSE banner with text and icons representing Artificial Intelligence and video learning

Detail Pembelajaran

Panduan Lengkap Membangun API RESTful Aman dengan .NET 7
  • API, RESTful, .NET, Keamanan, Pengembangan Perangkat Lunak

Baca Online

Panduan Lengkap Membangun API RESTful Aman dengan .NET 7

Daftar Isi

  1. Pengantar API RESTful dan Keamanan
  2. Persiapan Lingkungan dan Tools
  3. Membuat Proyek API RESTful dengan .NET 7
  4. Memahami Struktur Proyek
  5. Membuat Endpoint CRUD Sederhana
  6. Menambahkan Database dengan Entity Framework Core
  7. Menambahkan Autentikasi JWT
  8. Menambahkan Otorisasi Role-Based
  9. Validasi Input dan Error Handling
  10. Pengujian API dengan Postman dan Swagger
  11. Deployment API ke Azure atau Server Lain
  12. Sumber Belajar dan Referensi Tambahan

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.

Diagram ilustrasi arsitektur API RESTful yang aman dengan ikon kunci dan jaringan

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.
Gambar ilustrasi laptop dengan logo .NET, Visual Studio, Postman, dan database

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.

Tampilan terminal yang menjalankan perintah dotnet new webapi untuk membuat proyek baru

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.
Tampilan struktur folder proyek .NET 7 API di Visual Studio Code

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.

Tampilan Postman yang menguji endpoint GET api/products dan menampilkan daftar produk

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
      
Tampilan terminal yang menjalankan perintah migrasi database dengan dotnet ef

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.

Tampilan Postman yang mengirim request login dan menerima 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.

Diagram ilustrasi otorisasi berbasis peran dengan ikon pengguna dan kunci

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.

Tampilan Postman yang menampilkan response error validasi input produk

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.

Tampilan Swagger UI yang menampilkan dokumentasi endpoint API

Gunakan Postman untuk mengirim request GET, POST, PUT, DELETE dan menguji autentikasi JWT dengan menambahkan header Authorization: Bearer <token> .

Tampilan Postman yang mengirim request API dengan 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:

  1. Build aplikasi dengan perintah dotnet publish -c Release .
  2. Buat App Service di portal Azure dan konfigurasi deployment.
  3. Upload hasil publish ke App Service menggunakan FTP, Git, atau Azure DevOps.
  4. Set environment variables dan connection string di konfigurasi App Service.
  5. Jalankan dan tes API di URL Azure yang disediakan.
Diagram ilustrasi deployment aplikasi API ke Azure App Service dengan ikon cloud dan server

12. Sumber Belajar dan Referensi Tambahan

Berikut beberapa sumber belajar yang sangat membantu untuk memperdalam pembuatan API RESTful dengan .NET 7 dan keamanan:

Gambar ilustrasi buku dan laptop dengan ikon belajar online

Edukasi Terkait