Sayfalar

8 Ağustos 2013 Perşembe

ASP.NET MVC DERSLERİ ( 7.1 ) AUTHORIZE ATTRIBUTE VE YETKİLENDİRME

MVC uygulamalarında, belirli bir metod ve ya controller sınıfı için üyelik gerektiğini belirlemek amaçlı olarak, AuthorizeAttribute nesnesini kullanabiliriz. Bu nesnenin hiç parametre almayan hali ile sadece kullanıcının giriş yapıp yapmadığını kontrol ederiz. Yani sistemdeki bazı yerleri, giriş yapmayan kullanıcılara kapatırız.

Örnek kullanımı:
[Authorize]
public ActionResult UyeKullaniciSayfasi()
{
    return View();
}

şeklinde kullanılırsa UyeKullaniciSayfasi.cshtml sayfası için artık giriş yapmak gerekecektir. Eğer controller için kullanırsak:
[Authorize]
public class AdminController : AnaController
{
    private HaberSitesiDbContext db;
 
    public AdminController()
    {
        this.db = new HaberSitesiDbContext();
    }
 
    public ActionResult Anasayfa()
    {
        return View();
    }
 
    protected override void Dispose(bool disposing)
    {
        db.Dispose();
        base.Dispose(disposing);
    }
}

şeklinde olursa AdminController içerisindeki tüm metodlar için uyenin giriş yapması gerekecektir.

Web Forms ve MVC Yetkilendirme Farkları

Web Forms genel anlamda yetkilendirmeyi URL ye göre yapmaktadır. Örneğin bir Admin paneliniz var ve bu panele sadece Admin rolüne sahip olanların girme yetkisi olmasını istiyorsunuz. Yapmanız gereken bir klasör oluşturmak, mesela Admin klasörü, ve bu klasörün yoluna role göre yetki vermek. Yani Web Forms ile yapılan uygulamalarda dosya dizinini yetkilendirebilirsiniz. Bunu web.config dosyasında yapabilirsiniz. Örneğin;
<location path="Admin" allowOverride="false">
    <system.web>
        <authorization>
            <allow roles="Administrator" />
            <deny users="?" />
        </authorization>
    </system.web>
</location>

şeklinde bir tanımlamada, Admin klasörüne, sadece Admin rolünde olanlar girebilir. Bu da URL ile yetkilendirmedir.

MVC de yukarıdaki yöntem çalışmayacaktır. Bunu 2 sebebi vardır.

  1. Artık fiziksel dizinlere istek yapılmamaktadır.
  2. Aynı controller a birden fazla yönlendirme yapan mekanizma olabilir.
Örneğin, AdminController adında bir controller sınıfı olsun. Bu controller uygulamanın tüm admin işlemlerini içersin ve biz bunu Admin rolüne göre web.config içerisinde yukarıdaki gibi yetkilendirelim. Böylece Admin ile başlayan tüm dizinler Admin dışındaki rollere yasaklanacaktır. Fakat farklı bir yönlendirme kullanıldığında bu yöntem çalışmayacaktır. 

Örneğin, {controller} ve {action} sıralamasını değiştirirsek, yani Index/Admin yaparsak, artık bu yetkilendirme geçersiz olacaktır.

AuthorizeAttribute Nasıl Çalışır?

Bu nitelik için hiçbir kod yazmadık, ayrıca yetkilendirme olan sayfaya yetkisiz girmeye çalıştığımızda, sayfanın bizi ~/Account/Logon sayfasına yönlendirdiğini görürüz. 

Öncelikle AuthorizeAttribute aşağıdaki kodu çalıştırır. (aşağıdaki kod gibi davranır desek daha iyi olur)
IPrincipal user = httpContext.User;
if (!user.Identity.IsAuthenticated)
{
    return false;
}


Yani kullanıcının Form girişi yapıp yapmadığı kontrol edilir. Form girişi ayarı ve yünlendirme ayarı web.config içerisindeki aşağıdaki satırlarla belirlenmiştir.
<authentication mode="Forms">
    <forms loginUrl="~/Uyelik/GirisYap" timeout="2880" />
</authentication>

Giriş yapıp yapılmadığını FormsAuthentication nesnesi ile kontrol edileceğini, giriş yapılmamışsa nereye yönlendirileceği belirlenir. Bildiğiniz gibi FormsAuthentication ile aşağıdaki satırlar ile yapılıyor.
FormsAuthentication.SetAuthCookie(kullaniciAdi, false);

Kullanıcı, form girişi yaptıktan sonra, artık tüm proje içerisinde istediğiniz yerde (views, controllers) kullanıcının giriş yapıp yapmadığını User.Identity.IsAuthenticated satırı ile kontrol edebilirsiniz.

Buraya kadar anlattıklarımız, kullanıcının sadece giriş yapıp yapmadığı ile alakalı yetkilendirmelerdi. Bir sonraki derste, kullacınıya ve role göre yetkilendirmenin nasıl olduğunu göreceğiz.

4 yorum:

  1. Great work. Thanks

    YanıtlaSil
  2. Bu yorum yazar tarafından silindi.

    YanıtlaSil
  3. Sayenizde bir çok şey öğrendim, emeğinize sağlık :) Çok teşekkürler...

    YanıtlaSil
  4. wrox mvc5'ten mi bu örnek :)

    YanıtlaSil