Custom Authorize Attribute in Asp.Net Core (Policy Based)

Hakan Topuz
2 min readApr 23, 2020

Merhaba arkadaşlar,

Bu yazımda Asp.Net Core’da kendi authorize sınıfımızı yazacağız.

.Net Core’un hali hazırda var olan Authorize attribute’ü mevcut.Policy base veya role base olarak kullanabilirsiniz.Her iki yöntemi de destekliyor.

Biz şimdi özel durumlar vs. için kendi authorize sınıfımızı oluşturacağız.

Custom authorize atrribute ünü oluştururken IAuthorizationFilter interface’ini implemente edeceğiz.

Policy based bir authorization attribute oluşturacağız.Bunun için öncelikle Startup.cs dosyasındaki policy tanımlarına bir bakalım.

Policy tanımı için de böyle bir enum oluşturduk.

Bu şekilde policy tanımlarını yaptıktan sonra Authorize sınıfımızı oluşturabiliriz.

Attribute sınıfımız Policy enum’ını parametre olarak alacaktır.

Aktif kullanıcı için ilgili policy tanımına sahip olup olmadığını sorgulamak için ise sınıfımızın constructor’ında IAuthorizationService arayüzünü inject ediyoruz.

IAuthorizationService arayüzünün AuthorizeAsync metodunu kullanarak kullanıcının, ilgili policy tanımına sahip olup olmadığını kontrol edebiliyoruz.

Eğer kullanıcı ilgili policy tanımına sahip değilse, aktif metodun tipine göre bir geri dönüş yapıyoruz.Customize etmek için özel durumlar olabileceğinden bahsetmiştik.Benim özel durumum, eğer metodun tipi JsonResult ise “Bu işlem için yetkiniz yoktur” şeklinde bir mesaj dönebilmekti.

AuthorizationFilterContext sınıfından yararlanarak aktif metodun geri dönüş tipini belirleyip, buna göre bir result dönüyoruz.

Metodumuzun dönüş tipi JsonResult ise, içerisinde IsSuccess ve Message propertyleri olan base bir sınıf olan BaseResult sınıfına içerisine ilgili mesajı ekleyerek dönüyoruz.

Eğer metot bir JsonResult döndürmüyor ise, bu durumda dönüş tipimiz ForbidResult oluyor.

ForbidResult, 403 Http koduna sahip, Access Denied hatası döndürüyor.Default olarak “Account/AccessDenied” sayfasına yönleniyor.Bunu da değiştirmek istersek Startup.cs dosyasındaki, AddAuthentication metodunun config ayarlarından AccessDeniedPath değerini ayarlayabiliyoruz.

Şimdi gelelim yazdığımız PolicyBasedAuthorize attribute’ünü kullanmaya.

İşte bu kadar.Policy based bir custom authorization yapmak istersek bu şekilde yapabiliriz.Dediğim gibi özel bir durumumuz yok ise Authorize attribute’ü de rahatlıkla işimizi görecektir.

Sorularınız olursa yorum kısmına yazabilirsiniz, mutlaka cevap veririm.

Mutlu kodlamalar.

--

--