Yazılım Mimarileri ve Tasarım Desenleri Üzerine

Asp.NET Core Identity – Varsayılan Validasyon Mesajlarının IdentityErrorDescriber Sınıfı İle Özelleştirilmesi – VIII

Asp.NET Core Identity

Merhaba,

Asp.NET Core Identity yazı dizimizin son iki makalesinde(1. makale, 2. makale) hem password hem de username değerlerine dair varsayılan validasyon konfigürasyonun ve özelleştirilmiş validasyon yapılanmalarının nasıl geliştirildiğini incelemiştik. Bu içeriğimizde ise Identity mekanizmasında varsayılan validasyonlara verilen hata mesajlarının IdentityErrorDescriber sınıfı ile nasıl özelleştirilebildiğini inceleyeceğiz.

Yazı dizimizde kullandığımız örnek uygulamanın şuana kadar üzerinde yapılan etkinlikler neticesindeki en son halinde email adresi tekilleştirilmiştir. Ee bunun yanında username değeride değişmez bir varsayımla tekildir. Dolayısıyla gelin bu iki doğrulamaya takılacak bir üye ekleme girişiminde bulunalım.

Görüldüğü üzere belirtilen kullanıcı adı ve email bilgilerini kullanan kayıtlar olduğunu bildirmektedir. Lakin bunu İngilizce bir mesaj ile söylemektedir 🙂 Şimdi bizim amacımız bu mesajların içeriğini kendimize göre değiştirmektir. Yani bir başka deyişle özelleştirmektir.

Bu işlem için IdentityErrorDescriber sınıfından türeyen bir sınıf tasarlamamız gerekmektedir. Bu sınıf içerisinde varsayılan hata mesajını değiştirmek istediğimiz validasyonun, base classta virtual olarak tanımlanmış metodunu override ederek tekrar düzenleyeceğiz. Düzenleme işleminin ardından ilgili sınıfı Identity mekanizmasına entegre edecek ve böylece varsayılan validasyonlarda kendi hata mesajlarımızı devreye sokmuş olacağız.

Öncelikle IdentityErrorDescriber sınıfının içeriğini inceleyelim;

Görüldüğü üzere; email, password, username vs. gibi belli başlı ana değerlerin tekrar etmesi, uygunsuz veri olması vesair durumlarına karşılık metotlar barındırmaktadır. İşte yukarıda bahsettiğim ve override edileceğini söylediğim metotlar bunlar. Şimdi gelin çalışmamızı icra edelim.

Uygulamanın ana dizininde önceki makalelerimizde oluşturduğumuz “CustomValidations” klasörünün içerisine “CustomIdentityErrorDescriber” isminde bir sınıf ekleyelim ve ardından ilgili sınıfı IdentityErrorDescriber sınıfından türetelim.

    public class CustomIdentityErrorDescriber : IdentityErrorDescriber
    {
        public override IdentityError DuplicateUserName(string userName) => new IdentityError { Code = "DuplicateUserName", Description = $"\"{ userName }\" kullanıcı adı kullanılmaktadır." };
        public override IdentityError InvalidUserName(string userName) => new IdentityError { Code = "InvalidUserName", Description = "Geçersiz kullanıcı adı." };
        public override IdentityError DuplicateEmail(string email) => new IdentityError { Code = "DuplicateEmail", Description = $"\"{ email }\" başka bir kullanıcı tarafından kullanılmaktadır." };
        public override IdentityError InvalidEmail(string email) => new IdentityError { Code = "InvalidEmail", Description = "Geçersiz email." };
    }

Yukarıdaki kod bloğunu incelerseniz eğer belli başlı validasyon mesajlarını override ederek özelleştirmiş bulunmaktayım. Bu işlemden sonra artık yapmamız gereken, oluşturduğumuz “CustomIdentityErrorDescriber” sınıfını uygulamaya dahil etmektir. Bunun için “Startup.cs” sınıfını açıyoruz ve “ConfigureServices” metodu içerisine aşağıdaki eklemelerde bulunuyoruz.

    public class Startup
    {
        public IConfiguration Configuration { get; set; }
        public Startup(IConfiguration configuration) => Configuration = configuration;
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<AppDbContext>(_ => _.UseSqlServer(Configuration["ConnectionStrings:SqlServerConnectionString"]));
            services.AddIdentity<AppUser, AppRole>(_ =>
            {
                _.Password.RequiredLength = 5; //En az kaç karakterli olması gerektiğini belirtiyoruz.
                _.Password.RequireNonAlphanumeric = false; //Alfanumerik zorunluluğunu kaldırıyoruz.
                _.Password.RequireLowercase = false; //Küçük harf zorunluluğunu kaldırıyoruz.
                _.Password.RequireUppercase = false; //Büyük harf zorunluluğunu kaldırıyoruz.
                _.Password.RequireDigit = false; //0-9 arası sayısal karakter zorunluluğunu kaldırıyoruz.

                _.User.RequireUniqueEmail = true; //Email adreslerini tekilleştiriyoruz.
                _.User.AllowedUserNameCharacters = "abcçdefghiıjklmnoöpqrsştuüvwxyzABCÇDEFGHIİJKLMNOÖPQRSŞTUÜVWXYZ0123456789-._@+"; //Kullanıcı adında geçerli olan karakterleri belirtiyoruz.
            }).AddPasswordValidator<CustomPasswordValidation>()
              .AddUserValidator<CustomUserValidation>()
              .AddErrorDescriber<CustomIdentityErrorDescriber>().AddEntityFrameworkStores<AppDbContext>();
            services.AddMvc();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
                app.UseDeveloperExceptionPage();

            app.UseStatusCodePages();
            app.UseStaticFiles();
            app.UseAuthentication();
            app.UseMvc(_ => _.MapRoute("Default", "{controller=Home}/{action=Index}/{id?}"));
        }
    }

Yukarıdaki kod bloğunda 20. satıra göz atarsanız eğer “AddErrorDescriber” metodu ile oluşturduğumuz sınıfımızı uygulamaya dahil ediyoruz ve böylece uygulamadaki varsayılan validasyonların hata mesajlarının hangi kaynakta tanımlandığını belirtmiş oluyoruz. Dizisel içerik oluşturduğumuz için içeriksel sıralamayı göz önüne alarak önceki makalelerle bütünlüğü zedelememek adına örnek uygulamanın Startup.cs dosyasını sadeleştirmeden alma sebebimi mazur görürsünüz umarım.

Ve bu işlemden sonra artık uygulamayı derleyip çalıştırdığımızda tekrar aynı doğrulamalara yakalanacak verilerle bir üyelik işlemi gerçekleştirmeyi denediğimizde aşağıdaki görselde olduğu gibi hata mesajları tarafımızca özelleştirildiği gibi verilecektir…

Netice olarak bu noktaya kadar Identity mekanizmasının modifiye edilebilir bir esnekliğe sahip olduğunu gördüğünüzü düşünüyorum…
Bir sonraki içeriğimizde Cookie bazlı kimlik doğrulama mekanizması üzerine konuşacağız. Biliyorum… Konular derinleştikçe, yeni şeyler öğrendikçe ve mekanizmayı ifşa ettikçe daha ilgi çekici ve eğlenceli olmaktadır 🙂 Sabrınıza yetişebilmek için şimdilik görüşmek üzere diyorum 🙂

İlgilenenlerin faydalanması dileğiyle…
İyi çalışmalar…

Not : Örnek projeyi indirmek için buraya tıklayınız.

Exit mobile version