MVC – Custom Authorization Attribute
Asp.Net Microsoft .Net Nisan 15, 2017
Merhaba arkadaşlar bu yazımda size ASP.Net MVC projelerinde Custom Authorization Attribute konusundan bahsedeceğim. Malumunuz yetkilendirme konusu bazen istediğiniz şeyleri yapamıyor. Bu durumda başvuracağımız bir yolda kendi yetkilenirme sistemimiz olacaktır.
Konuyu biraz daha detaylandırıp öyle anlatayım. Malumunuz Authorization olayı güzel ancak bazen biz session bazlı davranışlarıda bu authorizationa katmak istiyoruz veya başka bir sebeple daha dinamik ve farklı şeyler arayabiliriz. Bu yazıda CAA konusunu session ile nasıl çalıştıracağımıza değineceğim. Hemen bir adet ASP.NET MVC projesi açalım.
Ana dizine bir Components dizini ekleyelim. Sonuç olarak Authorization sınıfı bir bileşen olarak çalışacaktır. Klasörümüze de SessionAuthorizationAttribute.cs adında bir sınıf ekleyelim.
Gördüğünüz gibi sınıfımız burada olacak. Şimdi olaya devam edecek olursak bu sınıfın standartları sağlayabilmesi için temel AuthorizeAttribute sınıfını içermesi gerekiyor. O yüzden sınıf tanımını şu şekilde yapalım.
public class SessionAuthorizationAttribute: System.Web.Mvc.AuthorizeAttribute
Standart AuthorizeAttribute sınıfı System.Web.Mvc altında bulunmaktadır. MVC dışında ki projelerde Authorization bu şekilde kullanılmadığı için (Web form vs) olay Mvc uzayının altında oluyor. Dönüyoruz geriye. Burada yapmanız gereken temel bir olay var, override edeceğiniz bir metod. İster override yazıp boşluk bırakın ve gelen listeden OnAuthorization eventini seçip enterleyin isterseniz resimde gördüğünüz kodu yazın (yada github daki projeyi indirin kullanın 🙂
Gördüğünüz gibi sınıfımız bu hali aldı. Peki şimdi session durumuna göre authorize olayına bakacağız. Burada authorize olmayan istekleri ben 401 hatasıyla durduracağım. Siz isterseniz redirect filan da yapabilirsiniz. Şöyle diyeceğim session da login değeri ok değilse hata ver.
Evet eğer session da ki login değeri null veya ok değilse bize Forbidden 403 hatası vermiş olacak. Şimdi her yerdemi bu olacak diye düşünmeyin kullanım şekline göre durum değişiyor elbet. Planımız şu standart home controllerinin about action una bunu uygulayalım.
About actionuna erişildiği zaman aşağıdaki hatayı alacaklar.
Tabi edge hatayı direk verdi chrome bom boş getirsede, bu yüzden print screen edgeden aldım. İsterseniz projenize custom error pages ekleyin daha kolay yönetilir bu durum. Peki bu şekilde kullanmak bazen sizi sıkabilir, diyebilirsiniz ki ben bunu her actiona mı uygulayacağım, classa versek olmaz mı tabiki olur. Ancak home controllerinde ki bütün actionlar artık yetki isteyecektir. Hemen bazı arkadaşlar diyebilir AllowAnonymous yapıştırırız diye ama malesef aslında o attribute bu süreçte sadece bilgi veriyor, elbette alırsak. Kodu şöyle düzenleyelim önce.
Burada göreceğiniz gibi SkipAuthorization fonksiyonunu ekleyerek AllowAnonymousAttribute kullanılan bir yerde bu işlemi kontrol etme demiş olduk. Aksi halde AllowAnonymous yazmanız bir işe yaramayacaktır. Buna göre ayarlar isek controlleri
Bu durumda öncekine göre artık sadece About değil Contact actionu da session dan login değerini isteyecek. Peki bir adım daha atalım ve diyelim ki login değeri Attributeden belirlensin böylece dinamik bir sistem kurmuş oluruz. Hemen bir property ekleyerek işe başlayalım.
Bakın OkValue diye uyduruk bir değer oluşturdum ve if içerisinde session da ki login buna eşit mi dedim. Olay bu istediğiniz kadar property oluşturabilirsiniz. Bunları ister session için key veya değer olarak verebilirsiniz. Artık hayal gücünüz neye yetiyorsa. Şimdi controller tarafına geçelim.
Bakınız şimdi Attribute eklediğimizde propertynin değerini böyle atayabiliyoruz. Bundan sonrası sizin login sayfanızda bu şekilde sessiona değer atayıp buradan okumak olacak. Projenin tamamı github da
Bu yazı 2328 defa görüntülendi