MVC’de (Data Annotation ile) Özel Yetkilendirme Sınıfı

c# logo

MVC ile çalışırken Data-Annotation olarak Authorize sınıfı bazen yetersiz kalabiliyor. Özellikle birden fazla rol tanımlaması yaptığınızda ya da komplex yapıda izin sistemi oluşturmanız gerektiğinde Authorize sınıfı yetmeyebiliyor. Microsoft, bu olayı core ile çözmüş olsa da (burada) standart mvc ile yapmak için aşağıdaki gibi basit bir sınıf ile MVC ile özel yetkilendirme sınıfı oluşturma sorunu çözülebiliyor.

Data-annotationlar methodların başına gelen köşeli parantez ile kullanılan yardımcı satırlar. Örneğin;

[Authorize]
public ActionResult index() { }

şeklinde kullanıldığında, index methodu çağırılmadan önce authorize sınıfı çağrılacak, eğer devam edilirse index çalışacaktır. Authorize sınıfı mvc ile gelen bir yetkilendirme sınıfı. FormsAuthentication ile kullanılıyor ve oturum açtığınızda bu sınıf true olarak dönüyor, açık değilse false olarak dönüyor ve sizi oturum açma sayfasına yönlendiriliyor(web.config’de tanımlı).

Fakat bu Authorize sınıfı sadece oturum açık mı değil mi onu kontrol ediyor, eğer “oturum açıksa ve dokuman silme yetkisi varsa” gibi bir senaryonuz varsa şu şekilde kendi data-annotation sınıfı gibi özel yetkilendrirme sınıfı oluşturabilirsiniz. Açıklamalar kodda:

 #region global tanımlamalar
    /// <summary>
    /// Kişilere Atanabilecek izin listesi
    /// User modelinde, kullanıcıya bu izin tipleri ataması yapılabilir.
    /// </summary>
    public enum permissionTypes
    {
        dokuman_ekleme,
        dokuman_yonetme,
        resim_yukleme,
        resim_yonetme
    }

    /// <summary>
    /// Kullanıcı Modeli
    /// Oturum açan kullanıcının bilgilerinin tutulduğu sınıf.
    /// Veritabanından çekilen, oturum açıldığında sessionda tutulan bilgiler olabilir.
    /// </summary>
    public  class user
    {
        public static string name = "Sezer";
        public static List<permissionTypes> permissions = new List<permissionTypes> {
            permissionTypes.dokuman_ekleme, permissionTypes.resim_yukleme
        };
    }

    #endregion

    /// <summary>
    /// Özel Yetkilendirme Sınıfı
    /// </summary>
    public class CustomAuthorize: AuthorizeAttribute
    {

        //Talep edien izin türleri
        private readonly permissionTypes[] requestedRoles;
        public CustomAuthorize(params permissionTypes[] roles)
        {
            this.requestedRoles = roles;
        }
        //Yetkilendirme doğrulamasını yapacak olan çekirden method
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            // oturum acmak için formAuthentication kullanıyorsanız, önce oturum acık mı bunu kontrol etmelisiniz.
            //eğer oturum açıksa, kullanıcı izne sahipmi değil mi kontrol edilecek.
            if (HttpContext.Current.Request.IsAuthenticated == false)
            {
               // return false;
            }
            //talep edilen izinler kullancıcının izinlerinde tanımlı mı kontrol edelim
            foreach (var role in requestedRoles)
            {
                if (user.permissions.Any(x=>x == role))
                {
                    return true;
                }
            }

            return false;
        }

        //Yetkilendirme başarısız ise çağırılacak sınıf
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            //izin yok sayfasına yönlendirebilirsiniz.ya da ekrana birşeyler yazdırabilirsiniz
            filterContext.Result = new HttpNotFoundResult();
        }

Kullanımı ise şu şekilde:

[CustomAuthorize(permissionTypes.dokuman_yonetme,permissionTypes.resim_yukleme)]
public ActionResult Index()
{
   return View();
}

Geliştirmesi size kalmış. AuthorizeCore sınıfını istediğiniz şekilde geliştirebilirsiniz.

1 Comment

Bir cevap yazın

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