ASP.NET Core – Identity / Custom User ve Role Sınıflarının Tanımlanması

Bu yazımızda ASP.NET Core Identity üzerinde custom User ve Role sınıfı tanımlayıp projeyi ayağa kaldıracağız.

Projeyi sıfırdan oluştururken Additional Information aşamasında Authentication Type kısmı varsayılan olarak None değeriyle gelir. Gerekli olan paketlerin otomatik projeye dahil edilmesi için proje oluşturulma aşamasında Authentication Type değerini Individual Accounts olarak ayarlıyoruz.

IdentityProject adında bir MVC projesi açıyor ve Models dosyasının içine AppUser ve AppRole sınıflarını aşağıdaki şekilde oluşturuyoruz.

using Microsoft.AspNetCore.Identity;

namespace IdentityProject.Models
{
    public class AppUser : IdentityUser<int>
    {
        public string Name { get; set; }

        public string Surname { get; set; }
    }
}
using Microsoft.AspNetCore.Identity;

namespace IdentityProject.Models
{
    public class AppRole : IdentityRole<int>
    {
        public DateTime CreatedDate { get; set; }
    }
}

Yukarıda yaptığımız işlemleri açıklayacak olursak; Microsoft.AspNetCore.Identity üzerinden projemize dahil olan IdentityUser ve IdentityRole sınıflarımızdan miras alarak sınıflarımızı oluşturuyoruz. Miras alınan bu sınıfların yapısına baktığımız zaman tanımlı propertylerinin bulunduğunu göreceğiz. Biz ise burada bu mevcut propertylerin üzerine AppUser için Name ve Surname, AppRole sınıfı için ise CreatedDate propertylerini dahil etmiş oluyoruz. Sınıfları miras alırken tip olarak int değerini vererek oluşturulacak olan tabloların primary key’lernin int değer olacağını belirtiyoruz. Bu tip belirtilmesi gerçekleştirilmezse varsayılan olarak primary key değerleri string tanımlanacaktır.

Projeyi oluştururken Authentication Type değerini Individual Accounts olarak ayarladıysanız projenizin kök dizininde Data adında bir klasör oluşturulduğunu ve içinde ApplicationDbContext adında bir sınıf oluşturulduğunu göreceksiniz. Bu sınıfı incelediğimiz zaman aşağıdaki yapı bizi karşılıyor olacak.

using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;

namespace IdentityProject.Data
{
    public class ApplicationDbContext : IdentityDbContext
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }
    }
}

EntityFramework kullanırken oluşturduğumuz ve DbContext’i miras alan sınıfla benzer bir yapıya sahip. Ancak bizim oluşturduğumuz sınıftan farklı olarak burada miras alınan sınıf IdentityDbContext olarak belirtilmiş. Özüne baktığımızda IdentityDbContext‘de DbContext sınıfından miras alıyor.

Proje oluşturulurken seçmiş olduğumuz Individual Accounts sayesinde proje bizim için bu sınıfı oluşturmuş olsa dahi User ve Role sınıflarımızı custom olarak oluşturmak istediğimiz için bu sınıf içinde ufak bir değişiklik yaparak aşağıdaki şekle sokuyoruz.

using IdentityProject.Models;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;

namespace IdentityProject.Data
{
    public class ApplicationDbContext : IdentityDbContext<AppUser, AppRole, int>
    {
        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
            : base(options)
        {
        }
    }
}

Miras alınan sınıfa sırası ile custom sınıflarımızı tip olarak verip son tipi de int olarak belirtiyoruz. Burada ki son tip oluşturulacak olan tabloların primary key’inin hangi türde oluşturulacağını belirtmek için kullanılıyor.

Projenin appsettings.json dosyasını açtığımız zaman göreceksiniz ki Individual Accounts seçeneği ile birlikte projenin ConnectionStrings ifadesi de otomatik olarak oluşturulmuş. Burada bu şekilde bırakabilir yahut istediğiniz şekilde düzenleyebilirsiniz. Ben bu örnek için aşağıdaki şekilde ayarladım.

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=.;Database=IdentityProjectDB;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

Şimdi sırada service’leri configure işlemimiz yer alıyor bunun için bu aşamayı yine ASP.NET 5 ve 6 için ayrı ayrı inceleyelim.

  • ASP.NET CORE 5

Startup.cs dosyasını açıyoruz. Individual Accounts seçeneği sayesinde AddDbContext ve AddDefaultIdentity servis konfigurasyonları ile UseAuthentication ve UseAuthorization middlewarelerının otomatik olarak eklendiğini göreceksiniz. Eğer bu aşamaya kadar benimle aynı yolu izlediyseniz AddDbDContext üzerinde bir değişiklik yapmamıza gerek kalmayacak. Ancak biz user ve role sınıflarını custom oluşturduğumuz için AddDefaultIdentity’yi silip bunun yerine aşağıdaki kodu ekliyoruz.

            services.AddIdentity<AppUser, AppRole>(options => options.SignIn.RequireConfirmedAccount = false)
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultTokenProviders()
                .AddDefaultUI();
            services.AddRazorPages();
  • ASP.NET CORE 6

Program.cs dosyasını açıyoruz. Individual Accounts seçeneği sayesinde AddDbContext ve AddDefaultIdentity servis konfigurasyonları ile UseAuthentication ve UseAuthorization middlewarelerının otomatik olarak eklendiğini göreceksiniz. Eğer bu aşamaya kadar benimle aynı yolu izlediyseniz AddDbDContext üzerinde bir değişiklik yapmamıza gerek kalmayacak. Ancak biz user ve role sınıflarını custom oluşturduğumuz için AddDefaultIdentity’yi silip bunun yerine aşağıdaki kodu ekliyoruz.

            builder.Services.AddIdentity<AppUser, AppRole>(options => options.SignIn.RequireConfirmedAccount = false)
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultTokenProviders()
                .AddDefaultUI();
            builder.Services.AddRazorPages();

Sırada, Individual Accounts seçeneği ile projemize dahil olan _LoginPartial.cshtml dosyasında yapacağımız düzenleme yer alıyor. Views > Shared yolunu izleyerek _LoginPartial.cshtml dosyasını açıyoruz ve

@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager

kodlarını

@inject SignInManager<AppUser> SignInManager
@inject UserManager<AppUser> UserManager

şeklinde değiştiriyoruz.

Son olarak, biz custom user ve role sınıfları oluşturduk ancak Individual Accounts seçeneği ile otomatik olarak oluşturulan dosyalar arasında, Data klasörünün altında Migrations klasörü ve içinde de bir migration dosyası da yer alıyor. Bu migration IdentityUser ve IdentityRole sınıfları için proje kurulurken oluşturulmuştu şimdi biz bu klasörü silip kendi AppUser ve AppRole sınıflarımız için yeni bir migration oluşturacağız. Bunun için Migrations klasörünü siliyor ve Package Manager Console’da aşağıdaki komutu çalıştırıyoruz

add-migration InitialCreate -o Data/Migrations

ve arından veri tabanını oluşturmak üzere

update-database

komutunu çalıştırıyoruz.

Projemiz ayağa kaldırılmak üzere hazır. Oluşan veri tabanını incelediğimizde dahil etmiş olduğumuz propertylerin ilgili tablolara eklendiğini göreceğiz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir