ASP.Net Core Projelerinde Güvenlik — Protect ve Unprotect İşlemleri

Herkese Merhabalar 🙂

Bir önceki yazımda Data Protection kavramına adım atmıştık. Bugünkü yazımda Protect ve Unprotect işlemleri ile ilgili uygulamaları sizlerle paylaşacağım. Geçen yazımda da bahsettiğim gibi konu ile ilgili Udemy’den almış olduğum Fatih Çakıroğlu’nun Asp.Net Core Security(Güvenlik) eğitiminden faydalanıyorum. Ve notlarımı bu eğitimden çıkarıyorum. Bir şeyleri öğrenirken not alıp sonrasında onları yazıya çevirdiğimde konuyu gerçekten sindiriyorum diyebilirim. Ve tabi bu yazıya denk gelenlere de faydalı olabileceği ihtimali beni gerçekten motive ediyor. Bu şekilde çalışmak benim için gerçekten faydalı oluyor. Umarım sizin için de faydalı olur 🙂

O halde haydi başlayalım!

  • Geçenki yazımda bahsettiğim gibi datayı şifrelemek için gerekli ortamı IDataProtector interfacesi ile hazırlamıştık. Dependency Injection ile doldurma işlemini gerçekleştirerek, projeye de enjekte etmiştik. Şimdi ise Product’da bulunan Id’nin şifrelenme işlemini gerçekleştireceğiz .
  • Her şeyden evvel bu Id şifreleneceği için, buna karşılık gelen bir property oluşturarak, şifrelenecek olan Id’yi bu property içerisinde tutmamız gerekir.
  • Bu Property’i EncryptedId olarak belirleyebiliriz. Bu property string olmalıdır.
  • Geçen yazıdan bildiğiniz üzere buradaki işlemler Entity Framework Tools yardımıyla Database First mantığında oluşturuldu. Mümkün oldukça toollar tarafından oluşturulan kodlara müdahele edilmemesi gerekmektedir. Otomatik olarak oluşturulduğundan yeni oluşturacağımız property veri tabanından çekilen modelin içerisine verilmemesi gerekir. Çünkü eğer ileride veri tabanından bir kolon eklemesi vs yaparsak ve ve bu şifrelenmiş alanı veri tabanına eklemediğimiz için, veri tabanındaki son bilgiyi çektiğimizde bu EncryptedId alanı kaybolacaktır. Nedeni ise, tüm bilgiler silinip tekrar oluşturulacaktır.
  • O nedenle bu alanda yapılması gereken yeni bir partial class oluşturarak bu iki class arasında köprüyü sağlayabilmektir. Dikkate ederseniz classın adı aslında CustomProduct olarak açabilirsiniz ama içerisinde gene Product partial classı ile oluşturmanız gerekir. Bu da iki classın birbiri ile bağlantısını sağladı. NotMapped attributesinin verilmesinin sebebi ise, “Bu property veri tabanına ait bir property değildir.” mesajını verebilmektir.
  • Şifreleme işlemleri için şimdi Controller kısmına geçelim
  • DataProtector’u bir önceki makalede bu controller içerisinde Dependency Injection ile çağırmıştık. Şimdi Index alanında şifreleme işlemi ile ilgili yapıyı kuracağız.
  • Öncelikle ürünleri listeliyoruz. Bu ürünlerin içerisinde dönüyoruz. EncryptedId partial olarak oluşturduğumuz ikinci classtan sıkıntısız bir şekilde geldi . Yani iki class birbiriyle birleşmiş oldu.
  • Ürünler içerisinde dönerek EncryptedId’yi daha önce Dependency Injection ile eklemiş olduğumuz IDataProtector‘daki Protect metodu ile sağlayabiliriz. Zaten Protect içerisinde string bir değer istiyor o nedenle Id’ yi verip ToString() ile string bir değere çevirdik.
  • Ancak yapacağımız işlem bitmedi. Bunun view kısmına gelmemiz gerekiyor. Çünü Index’te details kısmını biz normal şartlarda Id ile açıyorduk. EncryptedId ile açılması için aşağıdaki değişikliği yapmamız gerekir.
  • Ayrıca ürünün detayının açılabilmesi için controllers içerisindeki Details alanında değişiklik yapmamız gerekir. Çünkü Details sayfası Nullable Integer bir değer ile açılırken şimdi string bir değerle açılacağı için parametrenin değişmesi gerekir.
  • Parametreden bize Protect metotu ile şifrelenmiş bir data geldi. Bizim şimdiki amacımız bu şifrelenmiş datayı çözebilmek ve ürün detayını açabilmektir. Bunun için IDataProtector içerisindeki UnProtect metodundan yararlanıyoruz. UnProtect metodu bize string bir değer döndürdüğü için Integer bir değere parse ederek Id’yi elde etmiş olduk.

Veee tabiki mutlu son , Id parametremiz şifrelendi. 🙂

Bir sonraki yazımda görüşmek üzere 🙂

https://github.com/KardelRuveyda/ASPNetSecurity kodları Github ‘da oluşturduğum Repository’den inceleyebilisiniz.

Kaynakça