ASP.NET CORE 5.0 projesine Identity ile üyelik sistemi oluşturmak

Merhaba arkadaşlar bugün sizlerle ASP.NET CORE 5.0 projemize Identity framework ’ünü kullanarak bir üyelik sistemi oluşturalım.

ASP.NET Core Identity, kullanıcıların, login logout, yetkilendirme, şifre hatırlatma ve benzeri tüm işlemleri hızlı bir şekilde gerçekleştirmemizi sağlayan bir framework ’tür.

Lafı fazla uzatmadan projemize geçelim ve proje üzerinden anlatmaya çalışalım. Ben katmanlı mimari ile oluşturmuş olduğum projede anlatacağım. Sizler istediğiniz projede istediğiniz şekilde kullanabilirsiniz.

Öncelikle ekleyeceğiniz katmana sağ tık Manage nuget package alanına gelin buradan Microsoft.AspNetCore.Identity.EntityFrameworkCore paketini aratıp install diyerek yüklemeyi yapın.

Yüklenmiş olan paketimiz

Ben projemi katmanlı mimari ile oluşturduğum için DataAccess katmanıma paketi yükledim. Bu katman şu an beklesin biz projelerimizde veri tabanı tablolarını tutmuş olduğumuz Entities katmanımızda yapacaklarımıza geçelim.

Öncelikle Entities katmanıma sağ tık manage nuget packet diyerek browser alanında Microsoft.Extensions.Identity.Stores paketini aratarak Entities katmanıma bu paketi install ediyorum.

Entities katmanına ilgili paketin install edilmiş hali

Entities katmanımızda User, Role, UserClaim, RoleClaim, UserLogin, UserRole, UserToken sınıflarını ekleyerek projemize göre özelleştirelim.

Özelleştirilmiş Kullanıcı Sınıfım

Yukarıdaki görselde görmüş olduğunuz üzere User sınıfımız IdentityUser sınıfından kalıtım alıyor generic bir sınıf olduğu için ise int verilmiş ?

İnt verme amacımız nedir düşündünüz mü ?

IdentityUser sınıfı default olarak id alanlarını Guid yani benzersiz bir string karakteri ile tanımladığı için int verdim. Çünkü projemde benim User tablomun id alanının int olmasını istiyorum. Siz istediğiniz şekilde projelerinizde kullanabilirsiniz.

Ayrıca IdentityUser sınıfında yer almayan Picture alanının yani kullanıcı resim alanını ben tablomda istediğim için burada belirterek özelleştiriyorum.

Özelleştirilmiş Role Sınıfım

Aynı şekilde Role sınıfımızı oluşturarak IdentityRole sınıfından kalıtım alıyoruz ve id alanlarımızın int tanımlanması için int olarak generic sınıfa bildiriyoruz.

UserClaim, RoleClaim, UserLogin, UserRole, UserToken sınıflarımda özelleştirme yapmak istemediğim için yukarıdaki görselde gördüğünüz üzere Role sınıfı gibi bu sınıflarımı oluşturarak Identity tarafında buna karşılık gelen sınıflardan kalıtım alarak int tipini bildiriyorum. (makalenin uzayıp sizi sıkmaması için buraları geçiyorum.)

Daha sonra Projemizin daha önceden kodlanmış olan DbContext sınıfına giderek Identity yapılandırmalarımızı yapalım.

DbContext sınıfımız

Yukarıda gördüğünüz üzere HappyBlogContext adını verdiğim sınıfım IdentityDbContext sınıfında kalıtım alıyor. Generic olarak oluşturmuş olduğumuz sınıflarımızı IdentityDbContext sınıfına tanıtıyoruz.

Sınıfımız içerisinde görmüş olduğunuz diğer DbSet alanlarımız ise veri tabanına yansıyacak diğer tablolarımızdır. Makale içeriği gereğince onları anlatmam hoş karşılanmayacağı için oraları geçiyorum.

Dikkat ederseniz oluşturmuş olduğumuz User, Role vb. sınıflarımızı burada DbSet ile tanımlamıyoruz. Çünkü Identity bizim yerimize bunları veri tabanına tanıtacaktır.

DbContext tarafında işimiz tam olarak bitmedi artık oluşturmuş olduğumuz bu sınıfların veri tabanına yansırken alacağı konfigürasyonları belirlememiz ve kendimize göre özelleştirmemiz gerek.

DataAccess katmanımıza yeni bir klasör açalım ve adını Mapping olarak verelim. Bu klasörde Fluent API sınıflarımız yer alacaktır.

UserMap Sınıfımız

UserMap adında bir sınıf açarak IEntityTypeConfiguration interfacesinden kalıtım alıyoruz. Bu interface de yer alan Configure() methodunu imlement implementasyon diyerek bu sınıfımız içerisinde dolduracağız. Burada IdentityUser sınıfımız içerisinde yer alan property alanlarımızın veri tabanına sutun olarak yansırken alacağı tipleri ve zorunlu alanları vs. belirleyebiliriz.

Görselde görüldüğü üzere Microsoft sitesinde bu konfigürasyonlar yer almaktadır. Dilerseniz görseldeki linkten (https://docs.microsoft.com/tr-tr/aspnet/core/security/authentication/customize-identity-model?view=aspnetcore-5.0) siteyi ziyaret ederek sizde göz atabilirsiniz.

Burada diğer oluşturmuş olduğumuz Role, UserClaim, RoleClaim vs. gibi sınıflarımız içinde ayrı ayrı sınıflar açarak aynı şekilde IEntityTypeConfiguration interfacesinden kalıtım alarak (ve generic olarak sınıf adı belirterek) Configure methodu içerisinde istediğimiz gibi alanlarımızı düzenleyebiliriz. Buraları geçiyorum aynı işlemler olduğu için.

Artık DbContext sınıfımıza giderek OnModelCreating() methodunu override edip bu Map sınıflarımızı verebiliriz.

OnModelCreating metodu içerisine yazdığımız map sınıflarını tanımlıyoruz.

Evet artık Web katmanımızda startup.cs sınıfı içerisinde bu yapılandırmalarımızı tanımlayarak işlemimizi bitirebiliriz.

Startup.cs sınıfımız içerinde yer alan ConfigureServices metodu içerisine gelip aşağıdaki görseldeki gibi tanımlamalarımızı yapalım.

IServiceCollection Extension sınıfım

Startup.cs sınıfında yer alan ConfigureServices metodu içerisinde karışıklıklar olmaması için Extension Method yazarak kullandım ben burayı siz Startup.cs sınıfında ConfigureServices metodu içerisine yazsanız da problem çıkmayacaktır.

LoadMyServices methodu içerisindeki Identity yapılandırma

Bizim burada asıl dikkat edeceğimiz nokta yukarıdaki görselde görüldüğü gibidir. Burada AddIdentity extension methoduna User ve Role sınıflarımızı tanıttıktan sonra Identity üyelik sistemimizi özelleştiriyoruz.

Password ve User alanlarını kendi isteğimiz ve proje ihtiyaçlarına göre şekillendirebiliriz. Microsoftun ilgili makalesine bu (https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity-configuration?view=aspnetcore-5.0) linkten erişerek daha fazla konfigürasyon ayarlarına bakabilirsiniz.

Artık Startup.cs sınıfımız içerisindeki ConfigureServices metoduna içerisinde bu kodu (services.LoadMyServices(Configuration);) ekleyerek yazmış olduğumuz extension metodumuzu tanıtmış oluyoruz.

Artık Startup.cs sınıfı içerisindeki Configure methodu içerisinde middleware’lerimizi tanımlayarak işlemlerimizi bitirebiliriz.

Configure Methodu yapılandırmalarımız

Yukarıda görselde görüldüğü üzere UseAuthentication ve UseAuthorization middleware’lerimiz buraya eklenmiş. Öncelikle bunları açıklayayım.

1- Authentication Nedir ?

Kullanıcının bir sisteme erişebilme veya müdahale etmek için sistemde tanımlanan kullanıcı olup olmadığının kontrolüdür. Kısaca kimlik doğrulama diyebiliriz.

2-Authorization Nedir ?

Sistemde doğrulanmış kullanıcının hangi rollere, sınırlara sahip olduğunun belirtilmesidir.

Peki bunları ekledik ama yeri sırası önemi var mıdır?

Tabiki de var arkadaşlar öncelikle sisteme giriş yapan kullanıcılar ilgili giriş paneline gelebilmesi için UseRouting() middleware nin altına eklememiz gerek bunları.

Dikkat edilecek bir diğer husus ise UseAuthentication() middleware’nin UseAuthorization() middleware’inden önce tanıtılması gereklidir. Çünkü sisteme giriş yapan kullanıcı öncelikle polis kontrolünden geçmesi daha sonra erişeceği alanlara erişmesi gerekir.

Burada polis görevini gören UseAuthentication() middlewaremizi önce ekliyoruz daha sonra yetkisi olduğu alanları görebilmesi için kullanıcının UseAuthorization() middlewareni ekleyip konfigurasyonlarımızı tamamlamış oluyoruz.

Artık Identity üyelik sitemini projemizde kullanabiliriz.Eklemiş olduğumuz sınıfların veri tabanına yansıması için Package Manager Console sekmesinden migration oluşturup veri tabanına yansıtabilirsiniz.

References

https://docs.microsoft.com/tr-tr/aspnet/core/security/authentication/customize-identity-model?view=aspnetcore-5.0

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity-configuration?view=aspnetcore-5.0

İlgilenenlere faydalı olması dileğiyle…

Veysel MUTLU — Bilgisayar Mühendisi

linkedin.com/in/veysel-mutlu/

Junior Software Developer