Asp.Net Core Rol Bazlı Kimlik Doğrulama

Bu yazımda Asp.Net core 3.1 ile rol bazlı yetkilendirmenin identity olmadan nasıl yapılacağını anlatacağım.

Neden Identity Olmadan Yapıyoruz?

İhtiyacımız olan sadece role bazlı doğrulama olduğundan identity’i kullanmak gereksiz olabilir, kapsamı çok daha geniş. Ve bence en önemli neden identity ile açınca direkt yapıp geçiyoruz neyin nasıl çalıştığı hakkında pek fikrimiz olmuyor bir de burada bir sorun çıkarsa çözmesi zaman alabiliyor.

Asp.net Core 3.1 projesi açarak başlayalım.

code-first ile veritabanımızı oluşturacağız. User, Role ve UserRole adlı üç tane tablomuz olacak.

Çoka çok ilişkinin veritabanına yansıması için ilgili context sınıfımızda fluent api kullanmalıyız.

Contextimizi middleware’de tanımlayalım

Tablolarımız kullanıma hazır komut satırına aşağıdaki komutları yazıp veritabanına ekleyelim

Startup.cs de cookie ayarlarını tanımlayalım

HomeController’a basit bir login action’ı ekleyelim ve viewini oluşturalım

Şimdi login action’ını yazmadan önce claim kavramını açıklayalım.

Claim: Claim kelimesinin türkçe karşılığı talep etmek/iddia etmek/istek gibi kelimeler denilebilir. Programlama da ise anahtar-değer çiftlerini tutan/sağlayan tiplere denir. Örneklersek; diyelim ki sürücü ehliyeti veren xyz adlı bir kurum var A kişisi de bu kurumdan F tipi 2021’de geçerliliği sona erecek bir ehliyet alsın. Bu durumda iki tane claim oluşacak ilk claim’in ismi veriliş tarihi, değeri 2021 diğer claim’in de ismi ehliyet tipi, değeri de F olacaktır. Bu claimlerin sağlayıcısı xyz adlı kurum, claimlerin ait olduğu kişi de A kişisidir.

ApplicationContext’i homecontroller’a enjekte edelim.

Login Action’ı:

name’i unique olarak düşünün. Eğer name ve password eşleşirse kullanıcının veritabanından rollerini çekip claime kaydedeceğiz. Claimi de cookie de tutacağız.

ClaimIdentity ise dağınık claimlerimizi bir arada tutmasının yanında AuthenticationType’ı da tanımlamamıza yardımıcı oldu.

En son aşamada kullanıcıyı authenticate etmemiz gerekiyor. Bunun içinde ClaimsPrincipal sınıfına ihtiyaç var ClaimsPrincipal da ClaimsIdentity’iyi içine alan bir sınıf. Hiyeraşik olarak şöyle bir dizilim ortaya çıkıyor Claims > ClaimsIdentity > ClaimsPrincipal.

Logout metotu da şöyle olacak:

Veritabanımıza birkaç rol ve user kaydedip UserRoles tablosunda da tanımlayalım.

Authorize attribute ile de role göre kimlik doğrulamayı sağlayalım.

Index sayfasına istek gittiğinde önce kullanıcının giriş yapıp yapmadığına bakacak eğer giriş yapmış ise ClaimType.Role keyi ile tutuğumuz değerler ile attribute içindeki eşleşiyor mu kontrol edecek eğer uyuşuyorsa sayfayı açacak.

Özetlersek

Kullanıcının şifre ve kullanıcı adı eşleşiyor ise rolünü ve kullanıcı adını claim olarak cookie’de kaydediyoruz ve bu kaydettiğimiz değerleri rol gerekli actionlarda kontrol edip sonuca göre sayfayı gösteriyoruz.

Bu yazının sonuna geldik okuduğunuz için teşekkürler bir sonraki yazıda görüşmek üzere 🙂

You may also like...

2 Responses

  1. Hasan dedi ki:

    Merhaba,

    Öncelikle çok güzel bir makale olmuş çok faydalandım teşekkür ederim.

    Merak ettiğim bir konu var, userId erişmini nasıl sağlayacağız? Claimlere userId eklemedik fakat işlemlerimde userId gerekecek yanıtlayabilirseniz çok sevineceğim şimdiden teşekkürler,

    iyi çalışmalar,

    • Okan Karadağ dedi ki:

      Merhaba teşekkür ederim, login olduktan sonra claimleri eklediğimiz yerde identity.AddClaim(new Claim(“key ismi”, user.Id)); gibi bir key ile ekleyebilirsin. Getirirken de HttpContext.User.FindFirstValue(“key ismi”); kullanabilirsin.
      İyi çalışmalar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

tr_TRTurkish