Asp.NET Core Identity – Politika Bazlı Kimlik Doğrulama – XVI

Merhaba,

Asp.NET Core Identity yazı dizimizin 16. yazısında Politika Bazlı Kimlik Doğrulama(Policy Based Authorization) stratejisinin nasıl işlendiğine dair kalem oynatacağız. Ayriyetten ilgili içeriği yazı dizimizin oluşturulma sürecinde release edilen Asp.NET Core 3.0 versiyonu alt yapısında geliştireceğimiz bir projede örneklendireceğiz.

Politika Bazlı Kimlik Doğrulama(Policy Based Authorization) Nedir?

Policy Based Authorization, yetkilendirilmiş sayfalarda belirlenmiş rollerin dışında, türlü politikalar belirlememizi sağlayan ve kimlik doğrulama sürecinde bu politikalarıda değerlendiren bir stratejinin işleyiş adıdır.

Nasıl Politika Tanımlanır?

Bir politika belirleyebilmek için IAuthorizationRequirement ve IAuthorizationHandler interfacelerinden türemesi kaydıyla iki adet sınıfın oluşturulması gerekmektedir.
İlgili interfaceleri aşağıda değerlendirirsek eğer;

  • IAuthorizationRequirement
    İçerisinde herhangi bir member barındırmayan bu interface politika temelli yetkilendirmenin neticede başarılı olup olmadığını izlemeye yönelik bir sorumluluk üstlenecektir.
  • IAuthorizationHandler
    Belirlenen politika doğrultusunda şartların karşılanıp karşılanmadığını kontrol etmekten sorumlu arayüzümüzdür. Kendisinden türeyen “AuthorizationHandler” abstract sınıfı üzerinden somut handle sınıfını üretir.

Şimdi uygulamada aşağıdaki senaryoya uygun bir politika geliştirelim.

Bulunulan saatin dakikası 40 ile 50 arasında ise ilgili sayfaya erişim engellensin.

Bunun için öncelikle “IAuthorizationRequirement” türevi “TimeRequirement” ismini verdiğim sınıfımızı oluşturalım;

    public class TimeRequirement : IAuthorizationRequirement
    {
    }

Ardından “IAuthorizationHandler” türevi olan “TimeHandler” sınıfını geliştirelim;

    public class TimeHandler : AuthorizationHandler<TimeRequirement>
    {
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, TimeRequirement requirement)
        {
            if (DateTime.Now.Minute >= 40 && DateTime.Now.Minute < 50)
                context.Succeed(requirement);
            else
                context.Fail();
            return Task.CompletedTask;
        }
    }

Yukarıdaki handler sınıfında oluşturulan gereksinim, politikanın şartlarını ifade etmektedir. Dikkat ederseniz eğer o anki zamanın dakika bilgisi 40 ile 50 arasındaysa “Succeed” yok eğer değilse “Fail” fonksiyonları tetiklenmekte ve kullanıcı duruma göre yönlendirilmektedir. Nihayetinde oluşturulan bu politikayı değerlendirebilmek için sıra uygulamaya eklemeye ve kullanmaya geldi.

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            .
            .
            .
            services.AddAuthorization(x =>
            {
                x.AddPolicy("TimeControl", policy => policy.Requirements.Add(new TimeRequirement()));
            });
            services.AddSingleton<IAuthorizationHandler, TimeHandler>();

            services.AddControllersWithViews();
        }
    }

Yukarıdaki kod bloğunu incelerseniz eğer politikamızı oluşturabilmek için Startup dosyasında ConfigureServices metodunu kullanmamız gerekmektedir. İlgili metot içerisinde AddAuthorization metodu ile oluşturulan lambda ifadesi içerisinde AddPolicy fonksiyonu kullanılarak uygulamaya yeni politikalar oluşturulmakta ve bu politikaların ölçütünü belirleyecek gereksinimler görüldüğü gibi verilmektedir…

12. satırda ise politikamızdaki TimeRequirement nesnesinin kullandığı işlev sorumluluğunu üstlenen TimeHandler sınıfıda her talep neticesinde erişilebilsin diye AddSingleton metodu ile uygulamanın Dependency Injection providerına single instance olarak eklenmektedir.

Bu adımdan sonra üretilen politikayı kullanacak olan action yahut endpointler Authorize attributeu ile işaretlenirken biryandan da aşağıdaki gibi üretilen politika ile ilişkilendirilmektedirler.

    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
        [Authorize]
        public IActionResult Page1()
        {
            return View();
        }
        [Authorize(Policy = "TimeControl")]
        public IActionResult Page2()
        {
            return View();
        }
    }

Yukarıdaki kod bloğunda “Page1” actionı sadece Authorize attributeu ile işaretlenmişken “Page2” actionında ise doğrulanmasını istediğimiz politikanın hangisi olduğuna dair tanımlama yapılmış ve böylece politika bazlı doğrulama gerçekleştirilmiştir.
Asp.NET Core Identity – Politika Bazlı Kimlik Doğrulama – XVI

Evet… Görselde de görüldüğü üzere belirlediğimiz politika belirtilen dakika aralığında sayfaya giriş izni vermekte aksi taktirde başka sayfaya yönlendirmektedir.

Böylece bir yazımızın daha sonuna gelmiş bulunmaktayız. Bir sonraki içeriğimizde politika bazlı doğrulama yapılanmasıyla belirli bir noktada kesişecek Claim bazlı yetkilendirme yapılanmasını inceleyeceğiz. O halde şimdilik görüşmek üzere…

İlgilenenlerin faydalanması dileğiyle…
İyi çalışmalar…

Not : Örnek indirmek için buraya tıklayınız.

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. 08 Kasım 2019

    […] Asp.NET Core Identity – Politika Bazlı Kimlik Doğrulama – XVI […]

Bir cevap yazın

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

*