COMPUTER ENGINEER

Örneklere git
Blog
Next.js / ASP.NET Core / SQL6 dk çalışma
24/ 41

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?

AnlaÖrneği inceleKendin uygula

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.

NERESİNDE KULLANIRSIN?

Nesne düzeyinde yetki eksikliği, API güvenlik açıklarının en yaygınıdır.

SIK YAPILAN HATA

Yalnız [Authorize] eklemek ve kaynağın sahibini kontrol etmemek.

CANLI ANİMASYON

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.

İSTEMCİKENARWEB SUNUCUSUAPI · ASP.NET COREVERİTarayıcıKullanıcının ekranıAğDNS · TCP · TLSTers vekilTLS sonlandırma, sıkıştırmaNext.js sunucusuSSR ve route handlerKestrelHTTP sunucusuHata yakalayıcıMiddlewareRoutingEndpoint seçimiHız sınırıMiddlewareKimlik doğrulamaKim olduğunYetkilendirmeNeye izin varModel bindingHTTP → C# + doğrulamaControllerEndpoint koduServisİş kuralları (DI)RedisDağıtık önbellekEF CoreLINQ → SQLSQL ServerSorgu planı, indeks
GİDİŞ →

Biri giriş yapmadan yönetici mesajlarını istiyor.

TarayıcıSenin ekranın. İsteği yazan ve sonunda cevabı sayfaya çeviren yer.
1 / 6
01 / UYGULAMA

Aynı konu. Üç farklı derinlik.

Temsili örnek
[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.

02 / SIRA SENDE

Ö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
Açıklamalı çözüm
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.