Tüm Detaylarıyla AspNetCore.Identity Kütüphanesi : Validasyonların Yönetilmesi — Part 2

https://beanvalidation.org/

Herkese selamlar, bugün ele alacağımız konu bir devam yazısı olacak. Identity makale serimizin bu ikinci yazısında Identity Kütüphanesi ile varsayılan olarak gelen validasyonların yönetilmesi ve özel validasyonların oluşturulması konusunu ele alacağız.

Yazımıza devam etmeden önce konu bütünlüğünü kaybetmemeniz adına Tüm Detaylarıyla AspNetCore.Identity Kütüphanesi Kurulum — Part 1 makalesini okuyarak devam etmenizi öneririm.

Ara bir bölüm olarak validasyon validasyon deyip duruyoruz nedir bu validasyon. Önce bir buna bakalım.

Validasyon(Validation), başka bir deyişle kalifikasyon veya doğrulama için Wikipedia diyor ki : “Bir sürecin veya bir sistemin işlevini, önceden belirlenmiş gerekliliklere uygun olarak yerine getirdiğine emin olmak için gerçekleştirilen çalışmalardır.

Haydi şimdi en basit manada Asp.Net Core MVC ile Data Annotationları kullanarak bir validasyon işlemi oluşturalım ve handle edelim.

Yukarıdaki kod bloklarında Data Annotationları kullanarak Name property üzerinde zorunlu alan, tasarım üzerinde nasıl görüneceği ve en fazla 5 karakter olabileceği basit bir doğrulama işlemi yaptık.

View üzerinde de display name özelliğini görmek için bir label’a ve validasyonlardan doğacak olan hataları görüntüleyebilmek için de bir spana bağlama işlemlerini yaptık.

Sonuçlarımızda yukarıdaki görseller üzerinde görebiliriz.

Projelerimizde doğrulama işlemlerini en basit manada Data Annotationlar üzerinde bu şekilde gerçekleştirebiliriz.

Annotationlar yanında birçok farklı yöntemi kullanarak bu süreçleri server side veya client side olarak yönetebiliriz. Daha fazla uzatmadan bu ara bölümün son sözü olarak projelerinizde muhakkak server side doğrulamalar kullanmanızı öneririm. Çünkü client üzerinden yapılan doğrulamalar çok kolay şekilde aşılabilirler ve güvenlik zaafiyetleri yaratabilirler. Bu yüzden bu tür geliştirmelere projelerimizde önem vermeliyiz.

Identity Kütüphanesi ile Varsayılan Olarak Gelen Validasyonların Yönetilmesi

Önceki makalemizden aklımızda kalan bazı durumlara göz atarak ne gibi özelleştirmeler yapabiliriz bir bakalım.

Buradaki kısıtlama parolamızın en az 6 karakter olması gerektiğini, en az bir adet alfanumerik karakter içermesi gerektiği yanında bir adet küçük ve bir adet büyük harf barındırması gerektiğini söylüyor.

Bu validasyonları yönetmek için startup.cs’e gittiğimiz zaman AddIdentity’nin içerisine ikinci overload üzerinden bir action delegate aldığını gözlemlemekteyiz.

Github hesabımdaki Exercises reposu üzerinden delegates ile ilgili örnek kullanımları inceleyebilirsiniz. Bu repo içerisinde merak ettiğim konular ile ilgili örnek kullanımlar paylaşmaktayım.

ClaimsIdentityOptions üzerinden hangi alanlar üzerinde özelleştirmeler yapabileceğimizi inceleyebiliriz. Haydi şimdi de mesela parola alanı üzerinde bir takım özelleştirmeler yapalım.

Burada sadece büyük harf kısıtlamasının gerekli olduğunu diğer alanlardaki zorunlulukların kaldırılmasını söyledik. Haydi şimdi test edelim.

Düzenlemelerimizin sağlıklı bir şekilde çalıştığını gözlemlemekteyiz. Bu bölümün başındaki resim ile karşılaştırarak oluşan farklılıkları görebilirsiniz.

Özel Validasyonların Oluşturulması

Buraya kadar olan kısımda bazı validasyonların Identity kütüphanesi ile varsayılan olarak projemize entegre olduğunu gördük. Bunlar üzerinde nasıl geliştirmeler yapabileceğimiz konusunun da kafamızda iyice oturduğunu düşünüyorum. Şimdi de bu varsayılanda gelen validasyonlar dışında özel olarak neler yapabiliyoruz bir de bu konuyu inceleyelim.

Haydi şimdi bir senaryo oluşturalım ve bunun kodunu yazalım.

Mesela parolalarımız isim ve soyisim içeremesin gibi bir özel validasyon oluşturalım.

İlk adım olarak CustomPasswordValidator adında bir sınıf oluşturuyoruz ve bu sınıfa IPasswordValidator interfaceden kalıtım vererek başlıyoruz.

Bu kalıtım işlemini yaparken bu interface bizden bir user talep edecek bu yüzden içerisine tip olarak AppUser’ı veriyoruz.

Hangi kullanıcı ile çalışacağımızı da söyledikten sonra bizden aşağıdaki resimde de görülen ValidateAsync() metotunu implement etmemizi talep edecek.

Şimdi söz konusu implementasyon ile gelen metotu bir inceleyelim.

Öncelikle bu metotumuz bizden IdentityResult türünde bir dönüş beklemekte.

Bu dönüş tipini incelediğimiz zaman iki türde dönüş sağlayabildiğimizi görmekteyiz.

Success : Kontrolümüzün başarılı olduğunu,

Failed : Kontrolün başarısız olduğuna dair hata mesajlarını içeren bir dizi alır.

Dönüş tipi yanında bizden hangi UserManager üzerinden hangi kullanıcı için hangi parolayı doğrulayacağı sorularını sorduğu parametreler almakta olduğunu görüyoruz.

İlgili metotumuzun bizden beklentilerini inceledikten sonra haydi örnek senaryomuzun kodunu yazalım.

Yukarıdaki kodumuzu incelediğimiz zaman basit bir kontrol ile parolamızın isim ve soyisim içerip içermediğini kontrol ediyoruz ve eğer içeriyor ise bir hata dizisi (failed[]), içermiyorsa da başarılı(success) sonucunu dönüyoruz.

İlgili hata kontrolümüz hazır. Şimdi de bu hata kontrolünü kullanabilmek için identity kütüphanesine bu validator’ı kullanacağımızı söyleyelim.

Şimdi startup.cs içerisine gidiyoruz ve yukarıda en alt satırda görünen AddPasswordValidator kodunu ekliyoruz.

Özel validasyon oluşturma noktasında yazacağımız kodumuzun hepsi bu kadar. Şimdide hazırladığımız bu metota bir çağrı atarak sonuçlarını gözlemleyelim.

Bir kayıt işlemi gerçekleştirirken adımızı içeren bir parola(mustafa123) girdiğimiz zaman bu parolayı kullanmamıza izin verilmeyecek yukarıda görülen hata ile karşılaşacağız.

Bu makalemiz de buraya kadar.

Bir sonraki makalemize Çerezlerin yapılandırılması, Kısıtlamalar, Hata yönetimi, Kullanıcı rollerinin yapılandırılması, Mail üzerinden kullanıcı doğrulaması gibi konular ile devam edeceğim.

Demo proje : https://github.com/mustafadikyar/MyUtilities

MyUtilities reposu altındaki Core.Identity projesi referans alınmıştır.

Software Developer