ASP.NET Core'da Kimlik Doğrulama ve Yetkilendirme: Doğru Seçimi Yapmak
Bir API'nin her kontrolörüne [Authorize] koydum, token'lar doğrulanıyor, güvenlik auditi geçti. Sonra bir kullanıcı /invoices/1042 adresini /invoices/1043 olarak değiştirip başkasının faturasını okuyor. Sistem 'kırılmadı', kimlik doğrulama görevini yaptı. Ama yetkilendirme hiç soru sormadı. bu ayrım ASP.NET Core güvenliğinin kalbinde yatıyor.
Kimlik doğrulama (authentication) "sen kimsin?" sorusuna cevap verir. Parola, token, sertifika, kim olduğunu kanıtlarsın. Yetkilendirme (authorization) "ne yapabilirsin?" sorusuna cevap verir. Giriş yaptın ama o faturaya erişim hakkın var mı?
ASP.NET Core'un sağladığı araçlar güçlü ama seçenekler kafa karıştırıcı: cookies, JWT'ler, OAuth 2.0, OpenID Connect, Identity, schemes, policies, requirements, handlers. Hangisini seçmeliysin?
Kimlik doğrulama yöntemleri:
Cookies, geleneksel web uygulamaları için ideal. Durum bilgisi sunucuda, tarayıcı otomatik gönderir. JWT'ler ise API'ler ve mikroservisler için daha uygun, taşınabilir, durum bilgisiz, ölçeklenebilir. OAuth 2.0 ve OpenID Connect, üçüncü taraf giriş (Google, GitHub) veya merkezi kimlik hizmeti istiyorsan kullan.
Yetkilendirme stratejileri:
Basit [Authorize] sadece "giriş yaptı mı?" kontrol eder. Rol tabanlı [Authorize(Roles = "Admin")] işe yarar ama ölçeklemez. Politika tabanlı yetkilendirme (policy-based authorization) daha esnek: özel gereksinimler, talep (claim) kontrolleri, kaynak-tabanlı kontroller. Örneğin, bir kullanıcı yalnızca kendi faturalarını görebilsin diye bir politika yazarsın.
1public class InvoiceAuthorizationHandler: AuthorizationHandler<ViewInvoiceRequirement, Invoice>2{3protected override Task HandleRequirementAsync(4AuthorizationHandlerContext context,5ViewInvoiceRequirement requirement,6Invoice resource)7{8var userId = context.User.FindFirst(ClaimTypes.NameIdentifier)?.Value;9if (resource.OwnerId == userId)10{11context.Succeed(requirement);12}13return Task.CompletedTask;14}15}Bu handler, faturanın sahibi mi kontrol ediyor. Denetleyicide [Authorize(Policy = "ViewInvoice")] kullanırsın ve sistem otomatik olarak kaynak-tabanlı kontrol yapar.
Üretim ortamına gitmeden: API anahtarlarını config'e koy, token süresini akılcı ayarla (JWT'ler genelde 15 dakika), refresh token'ları güvenli saklı tut, HTTPS zorunlu yap, CORS'u dikkatli yapılandır, ve her endpoint'i test et, sadece giriş yapmış kullanıcılar değil, yetkili kullanıcılar doğru verileri almalı. Authentication ve authorization'ı ayrı ayrı test etmek, sonradan sürpriz açıkları kapatmaktan çok daha ucuz.
0 yorum