MVC’de Özel Kimlik Denetim Özelliği (Custom AuthorizeAttribute)

Merhabalar, bu yazıda mvc‘de özel kimlik kontrollerini gerçekleştirebileceğiniz bir yöntemden bahsedeceğiz. Bu yöntem sayesinde tek bir metoda veya tüm bir contoller‘a kolayca yetki verebileceksiniz.

Öncelikle attribute ve custom attribute kavramlarını hemen bir örnekle açıklayalım. Aşağıda gördüğünüz metodun üstünde yer alan ValidateAntiForgeryToken isimli ön tanımlı bir attribute‘tur.

[ValidateAntiForgeryToken]
public void SomeMethod(string someParameter)
{
...
}

Bu attribute‘un ne anlama geldiğini başka bir yazıda inceleyeceğiz. Burada önemli olan bu attribute metoda bir özellik kazandırdı. Birazdan kimlik denetimi için de yapacağımız buna benzer bir yöntem. Ancak biz bunu özel attribute (custom attribute) ile gerçekleştireceğiz. Özel attribute‘lar ön tanımlı attribute‘lara ek olarak sizin tarafınızdan yazılabilen attributelardır ve kullanımları aynı ön tanımlı attribute‘lar gibidir.

Kimlik denetimi için özel attribute‘umuzu oluşturmaya başlayalım. İlk olarak NeedsAuthorization adlı bir attribute yaratıyoruz. Bu attribute‘u kimlik denetimi için kullanacağımız için AuthorizeAttribute sınıfından inherit ederek bu sınıftan içerisindeki özelliklerden yararlanabiliriz.

public class NeedsAuthorization : AuthorizeAttribute
{
   protected override bool AuthorizeCore(HttpContextBase httpContext)
   {
   ...
   }
   protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
   {
   ...
   }
}
}

Bu classın için AuthorizeAttribute sınıfının iki metodunu override etmiş bulunmaktayız. Bunlardan ilki AuthorizeCore; attribute‘u kullandığımız action çağırıldığında ilk olarak gireceğimiz metod. Yani burada yetki ile ilgili ilk kontrolümüzü yapacağız. Ben yetkilerimi bu örnekte session üzerinden kontrol edeceğim.

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
   if (SessionController.User == null)
     return false;
   else
     return true;
}

Yukarıda görüleceği üzere metodun içinde kullanıcımın giriş yapıp yapmadığını kontrol ederek true veya false dönüyorum. Bunun anlamı eğer true dönerse yetki onaylanmış, false dönerse yetki onaylanmamıştır. True dönmesi durumunda attribute‘u kullandığımız action çalışacak ve işlem devam edecek. Ancak yetki onaylanmadıysa ve false döndüyse kullanıcıyı giriş sayfasına yönlendirmek istiyoruz.

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
   filterContext.Result = new RedirectResult("/giris?donURL=" + filterContext.HttpContext.Request.Url.PathAndQuery);
}

Yukarıda override ettiğimiz HandleUnauthorizedRequest metodu yetki onaylanmaması yani AuthorizeCore metodundan false dönmesi sonucu çağırılır. Biz de burada basit bir yönlendirme ile kullanıcıyı giriş sayfasına yönlendiriyoruz. Bunun için elimizdeki context‘in sonucunu değiştirip bir yönlendirme sonucu hazırlıyoruz. Aynı zamanda yönlendirme için hazırladığımız url‘nin içine donURL adında bir querystring parametresi ekliyoruz. Bu parametrenin içine verdiğimiz değer attribute‘un kullanıldığı action‘ın adresi. Bu sayede kullanıcı giriş yaptıktan sonra bu url ile kullanıcıyı kaldığı sayfaya yönlendirebileceğiz.

Sonuç;

public class NeedsAuthorization : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
       if (SessionController.User == null)
         return false;
       else
         return true;
    }
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
       filterContext.Result = new RedirectResult("/giris?donURL=" + filterContext.HttpContext.Request.Url.PathAndQuery);
    }
}

Son olarak ufak bir ekleme; attribute‘ları hem tek tek actionlar için hem de tüm controller için kullanabilirsiniz. Bununla ilgili iki örnek aşağıdadır;

Action için attribute kullanımı;

[NeedsAuthorization]
public ActionResult SomeMethod(string someParameter)
{
...
}

Controller için attribute kullanımı;

[NeedsAuthorization]
public class SomeController
{
...
}

İsterseniz bu iki kullanımdan istediğinizi limitleyebilirsiniz. Attribute classının öncesine yazacağınız başka bir attribute bu limitleme için çalışır. Aşağıdaki örnekte yazdığımız attribute‘un sadece metodlarda geçerli olması kuralını getirdik. Bu kuralı isterseniz sadece sınıflar için “class” veya tüm tipler için “all” olarak ayarlayabilirsiniz.

[AttributeUsage(AttributeTargets.Method)]
public class NeedsAuthorization : AuthorizeAttribute
{
...
}

Bir başka makalede görüşmek dileğiyle…

Click to rate this post!
[Total: 1 Average: 5]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.