Kimlik ve güvenlik
Yetkilendirme: rol, politika ve sahiplik
401 ile 403’ün farkı ve en sık atlanan kontrol: bu kaynak gerçekten senin mi?
Kavramı anlayalım
Kimlik doğrulama kim olduğunu, yetkilendirme ne yapabileceğini belirler. Kimliği doğrulanmamış bir istek korunan bir kaynağa geldiğinde yanıt 401’dir (önce kimliğini kanıtla). Kimliği doğrulanmış ama izni olmayan kullanıcıya 403 döner (seni tanıyoruz, ama hayır). ASP.NET Core’da bu ayrım otomatik yapılır: anonim kullanıcı ‘challenge’, yetkisiz kullanıcı ‘forbid’ alır.
Rol tabanlı yetki ([Authorize(Roles = "Admin")]) basit durumlar için yeterlidir. Daha esnek kurallar için politikalar kullanılır: bir politika claim’leri, kaynağın kendisini veya özel mantığı değerlendirebilir. Politikalar Program.cs’de bir kez tanımlanır ve endpoint’lere adıyla eklenir.
En sık yapılan hata nesne düzeyinde yetkilendirmeyi atlamaktır (BOLA / IDOR). ‘/api/invoices/42’ isteğinde kullanıcının giriş yapmış olması yetmez; 42 numaralı faturanın o kullanıcıya ait olduğu da kontrol edilmelidir. Aksi halde kullanıcı sadece URL’deki sayıyı değiştirerek başkalarının verisine erişir. Bu kontrol sorgunun içine sahiplik koşulu eklenerek yapılır.
Nesne düzeyinde yetki eksikliği, API güvenlik açıklarının en yaygınıdır.
Yalnız [Authorize] eklemek ve kaynağın sahibini kontrol etmemek.
Bir mektubun şehirdeki yolculuğu
İsteği bir mektup, sunucuyu bir şehir gibi düşün. Senaryo seç, oynat ve mektubun hangi kapıdan geçip nerede durdurulduğunu izle.
Biri giriş yapmadan yönetici mesajlarını istiyor.
Aynı konu. Üç farklı derinlik.
[Authorize(Roles = "Admin")]
[HttpDelete("{id:int}")]
public Task<IActionResult> Delete(int id, CancellationToken ct) => …Yalnız Admin rolüne sahip kullanıcılar silebilir.
Bu sayfa gerçek bir sunucuya veya veritabanına bağlanmaz. Kod örnekleri .NET 8, Next.js ve SQL Server için temsilîdir; süreler simülasyondaki örnek değerlerdir, ölçüm değildir. Örnekleri yalnız kendi geliştirme ortamında dene; gerçek bağlantı dizesi, token veya parola paylaşma.
Önce kendin dene.
Kullanıcı A, kendi siparişini /api/orders/1001 adresinde görüyor. Tarayıcıda 1002 yazınca kullanıcı B’nin siparişi açılıyor. Endpoint [Authorize] ile korunuyor. Sorun ve düzeltme nedir?
Çözümü ve açıklamasını göster
Sorun: nesne düzeyinde yetkilendirme yok (BOLA/IDOR).
Düzeltme: sorguya OwnerId == currentUserId koşulu ekle,
eşleşmezse 404 dön. Kimliği istemciden değil token’dan/oturumdan al.[Authorize] yalnız ‘giriş yapmış mı’ sorusunu yanıtlar; ‘bu kayıt onun mu’ sorusunu kod sormalıdır.