Asp.NET MVC’de NonAction ve ChildActionOnly Attributeları

Merhaba,

Biliyorsunuz ki, Asp.NET MVC mimarisinde Controller katmanında bulunan Action metodları tarayıcımızın adres çubuğu üzerinden tetikleyebilmekteyiz. Buradan çıkarabileceğimiz sonuç, server işlemleri dediğimiz kısma kullanıcı isterse adres üzerinden müdahale edebilmekte ve bu müdahale kritik noktalarda ehemmiyetli olabilmektedir. İşte bu tarz durumlara karşı güvenlik önlemi maksatlı kritik çalışmaların olduğu Action metodlarına NonAction yahut ChildActionOnly attributeları ile adresten erişimi engelleyebiliriz.

Öncelikle NonAction attributeunu ele alarak başlayalım.

NonAction Attribute’u

NonAction metodu, Controller içerisinde public olarak tanımlanmış normal metodları temsil etmektedir. Daha doğru bir şekilde ifade etmemiz gerekirse eğer, ilgili metod bir Action metod özelliğinde kullanılmayacaksa o metodu NonAction attribute’u ile işaretleyerek bir Action metod olmadığını bildiririz.

    public class HomeController : Controller
    {
        public int Islem()
        {
            return 4 + 2;
        }
    }

Yukarıda görmüş olduğunuz Islem metodu geriye int tipinde bir değer döndüren bir Action metotdur. Haliyle “/Home/Islem” adresine tarayıcımızın adres çubuğundan request(talep) gönderdiğimiz zaman bize result(sonuç) olarak yaptığı işlemin değerini döndürecektir.

        [NonAction]
        public int Islem()
        {
            return 4 + 2;
        }

Eğer ki ekranda da gördüğünüz gibi ilgili metod NonAction attribute’u ile işaretlenirse “/Home/Islem” adresi bir Action metodu işaret etmeyeceğinden dolayı çalışmayacaktır.

Aslında NonAction attributeu ilgili metodu birnevi private durumundaki gibi dışarıdan erişimsiz bir hale getirmektedir.

Şimdi gelelim ChildActionOnly attributeuna.

ChildActionOnly Attribute’u

ChildActionOnly attributeu, bir Controller’da bulunan Action metodunun direkt olarak urlden tetiklenmesini engellemektedir.
Burada dikkat etmenizi istediğim nokta şudur ki;

NonAction attributeu Action metod olmayan bir metodun urlden tetiklenmesini engellerken, ChildActionOnly attributeu ise Action metod olan bir metodun urlden erişilmesini engellemektedir. İkisi arasında ki temel fark budur.

Şimdi aşağıdaki kod bloğunu inceleyiniz.

    public class HomeController : Controller
    {
        [ChildActionOnly]
        public int Islem()
        {
            return 4 + 2;
        }
    }

Kod bloğunda görmüş olduğunuz Islem metodu bir Action metotdur. Eğer ki bu metodu NonAction attributeu ile işaretlemiş olsaydık bu sıradan bir metod(Action olmayan metod) olacaktı. Lakin ChildActionOnly attributeu ile işaretlendiğinden dolayı url üzerinden direkt erişilemeyen bir Action metod olmuştur. O yüzden ilgili attributeumuzun isminde “Child” ve “Only” kelimesi geçmektedir. Yani “Sadece Evlat Action” anlamında bir sıfata sahiptir.

Asp.NET MVC'de NonAction ve ChildActionOnly Attributeları

Görüldüğü üzere ilgili Action urlden tetiklendiği vakit yukarıdaki ekran görüntüsünde ki hatayla karşılaşılmaktadır.

Peki ChildActionOnly Attribute’u İle İşaretlenmiş Bir Action Metodu Nasıl Çalıştırırız?

Sıra asıl cevaplanması gereken soruya gelmiştir.

Eğer ki ChildActionOnly attributeu ile işaretlenmiş Action metodunu tetiklemek istiyorsanız “Html.RenderAction” metodunu kullanmanız yeterlidir. Bu metot ile ilgili Action metot çalıştırılır, yorumlanır ve sonuç ilgili alana getirtilir.

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        [ChildActionOnly]
        public int Islem()
        {
            return 4 + 2;
        }
    }
--- Index.cshtml ---
<div style="width:250px;">
    <strong>İşlem Sonucu</strong> : @{Html.RenderAction("Islem", "Home");}
</div>

Yukarıdaki kod bloğuna bakarsanız eğer Index.cshtml sayfası üzerinde Html.RenderAction metodu ile ilgili metodumuz tetiklenmiştir. Haliyle metot sonucuda tetiklendiği alana basılacaktır.

Bu attributelar cüzi miktarda da olsa gerekli yerlerde kullanıldığı taktirde bir güvenlik mahiyetinde işlev görmektedirler. O yüzden bilmekte her zaman fayda var lakin kullanmak ise her daim tercihinize kalmış…

Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*