Asp.NET Core Identity – Sayfaları Yetkilendirme (Authorization) – XV

Merhaba,

Bir önceki RoleManager Sınıfı İle Rol Yönetimi başlıklı makalemizde uygulama bazlı rol yönetimini incelemiş bulunmaktayız. Bu içeriğimizde ise oluşturulan roller odaklı Sayfaları Yetkilendirme(Authorization) işlemini ele alacağız.

Herşeyden önce yetkilendirilmiş sayfalara yetkisi olmayan kullanıcıların erişmeye çalışması durumunda nereye yönlendireceğimizi belirtmekle başlayalım. Bunun için Startup.cs dosyasında aşağıdaki konfigürasyonu gerçekleştirmemiz gerekmektedir.

    public class Startup
    {
        public IConfiguration Configuration { get; set; }
        public Startup(IConfiguration configuration) => Configuration = configuration;
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<AppDbContext>(_ => _.UseSqlServer(Configuration["ConnectionStrings:SqlServerConnectionString"]));
            services.AddIdentity<AppUser, AppRole>(_ =>
            {
                _.Password.RequiredLength = 5; //En az kaç karakterli olması gerektiğini belirtiyoruz.
                _.Password.RequireNonAlphanumeric = false; //Alfanumerik zorunluluğunu kaldırıyoruz.
                _.Password.RequireLowercase = false; //Küçük harf zorunluluğunu kaldırıyoruz.
                _.Password.RequireUppercase = false; //Büyük harf zorunluluğunu kaldırıyoruz.
                _.Password.RequireDigit = false; //0-9 arası sayısal karakter zorunluluğunu kaldırıyoruz.

                _.User.RequireUniqueEmail = true; //Email adreslerini tekilleştiriyoruz.
                _.User.AllowedUserNameCharacters = "abcçdefghiıjklmnoöpqrsştuüvwxyzABCÇDEFGHIİJKLMNOÖPQRSŞTUÜVWXYZ0123456789-._@+"; //Kullanıcı adında geçerli olan karakterleri belirtiyoruz.
            }).AddPasswordValidator<CustomPasswordValidation>()
              .AddUserValidator<CustomUserValidation>()
              .AddErrorDescriber<CustomIdentityErrorDescriber>().AddEntityFrameworkStores<AppDbContext>()
              .AddDefaultTokenProviders(); ;

            services.ConfigureApplicationCookie(_ =>
            {
                _.LoginPath = new PathString("/User/Login");
                _.LogoutPath = new PathString("/User/Logout");
                _.Cookie = new CookieBuilder
                {
                    Name = "AspNetCoreIdentityExampleCookie", //Oluşturulacak Cookie'yi isimlendiriyoruz.
                    HttpOnly = false, //Kötü niyetli insanların client-side tarafından Cookie'ye erişmesini engelliyoruz.
                    Expiration = TimeSpan.FromMinutes(2), //Oluşturulacak Cookie'nin vadesini belirliyoruz.
                    SameSite = SameSiteMode.Lax, //Top level navigasyonlara sebep olmayan requestlere Cookie'nin gönderilmemesini belirtiyoruz.
                    SecurePolicy = CookieSecurePolicy.Always //HTTPS üzerinden erişilebilir yapıyoruz.
                };
                _.SlidingExpiration = true; //Expiration süresinin yarısı kadar süre zarfında istekte bulunulursa eğer geri kalan yarısını tekrar sıfırlayarak ilk ayarlanan süreyi tazeleyecektir.
                _.ExpireTimeSpan = TimeSpan.FromMinutes(2); //CookieBuilder nesnesinde tanımlanan Expiration değerinin varsayılan değerlerle ezilme ihtimaline karşın tekrardan Cookie vadesi burada da belirtiliyor.
                _.AccessDeniedPath = new PathString("/authority/page");
            });

            services.AddMvc();
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
                app.UseDeveloperExceptionPage();

            app.UseStatusCodePages();
            app.UseStaticFiles();
            app.UseAuthentication();
            app.UseMvc(_ => _.MapRoute("Default", "{controller=Home}/{action=Index}/{id?}"));
        }
    }

37. satıra göz atarsanız eğer “AccessDeniedPath” özelliği sayesinde yetkilendirilmiş sayfaya erişmeye çalışan yetkisiz kullanıcıları “/authority/page” adresine yönlendirmekteyiz.

Bu işlemden sonra yapılması gereken tek iş yetkilendirilecek olan sayfaların aşağıdaki gibi Authorize attribute’u ile işaretlenmesidir.


Yukarıdaki ekran görüntüsüne dikkat ederseniz eğer oturumu açık olan kullanıcının yetkileri değiştirildiği an tekrardan oturumunu yenilemesi gerekmektedir. Aksi taktirde mevcut oturum boyunca eski yetkileriyle sürece devam edecektir.

Evet… Yazı dizimizin bu makalesinde de rol bazlı yetkilendirme hakkında son noktayı koymuş bulunuyoruz. Sonraki makalelerimizde Claims Bazlı Yetkilendirme(Claims Based Authorization) üzerine konuşuyor olacağız. O halde şimdilik görüşmek üzere diyelim…

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

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

Bunlar da hoşunuza gidebilir...

10 Cevaplar

  1. Murat Fatih ARKAN dedi ki:

    Merhaba , Ben rol bazlının yanında aslında şöyle birşey yapmayı da düşünüyorum.Benim UserEdit rolüm var ve bunun yetkileri A sayfasını ve B sayfasındaki dataları editlemek aynı anda UserCreate rolümde ise A sayfasına yeni kayıt ekleme ve B sayfasına yeni kayıt ekleme.Benim sistemde iki kullanıcım var be birinde UserEdit diğerinde UserCreate rolüm var ve bunlar sonuçta A ve B sayfalarını açıyorlar.Fakat yetkileri görüldüğü üzere farklı ve sisteme de admin kullanıcısı dinamik olarak Rol ekleyebiliyor bunun yönetimini nasıl yapabilirim ?

    • Gençay dedi ki:

      Merhaba,

      Kullanıcılar aynı ekranı görebilecektirler lakin yetkilerinin dışında bir işlem yapamayacaklardır. Yani tasarımınızda bir sıkıntı söz konusu olmayacaktır.

      • Murat Fatih Arkan dedi ki:

        Merhaba , cevabınız için teşekkürler. Daha doğrusu şöyle ifade ediyim görüldüğü üzere rol bazli da statik olarak rollerin isimleri yazılıyor ve authorize ediliyor benim yapmak istediğim ise bu rollerin sistem kullanicilari tarafindan oluşturulması ve bunlara claimler vererek ( rollere claim , roleclaim tablosu ) ve böylece ben authorize ederken sistem statik tanımladığım enum içerisindeki claime ( updateUser , createUser ) gibi kontrol etmek istiyorum umarim doğru anlatmisimdir.

        • Gençay dedi ki:

          Merhaba,

          Sanırım dinamik bir yetkilendirme yapmak istiyorsunuz. Doğru anlayabildim mi?

          • Murat Fatih Arkan dedi ki:

            Evet , doğru anladınız sistemin kontrolü tamamen kullanıcılarda olacak.

          • Gençay dedi ki:

            Merhaba,

            Dinamik yetkilendirme işlemi yapabilmek için rol bazlı yetkilendirmenin yanında Politika Bazlı Yetkilendirme ile dinamik çalışma gerçekleştirebileceğinizi düşünüyorum.

            Konuya dair detay gerekirse bu konu üzerinde hususi bir çalışma yapabilirim.

            Geri dönüşünüzü bekliyorum.
            Görüşmek dileğiyle.

  2. Murat Fatih ARKAN dedi ki:

    Merhaba , aslında yapmak istediğim şey Auth attribute içerisinde static role kontrolü yerine [Auth(“Role1,Role2”)] yerine [Auth(PermissionTypes.EditBankTransaction)] dediğimde bu EditBankTransaction permission’a sahip kullanıcıları buraya yönlendirmek onun haricinde tamamen yetkisiz olarak algılamak istiyorum , bunun için örnek bir çalışma yapabilirseniz güzel olur diye düşünüyorum.

    Ayrıca IdentityRoleClaim isimli bir tablo mevcut bu tabloyu kullanarak birşeyler yapabileceğimi düşünüyorum.

  1. 02 Ekim 2019

    […] Asp.NET Core Identity – Sayfaları Yetkilendirme (Authorization) – XV […]

  2. 08 Kasım 2019

    […] Based Authorization, yetkilendirilmiş sayfalarda belirlenmiş rollerin dışında, türlü politikalar belirlememizi sağlayan ve kimlik […]

  3. 01 Aralık 2019

    […] Tabi temel amaç bu değildir. Asıl amaç, bu bilgileri yetkilendirme senaryolarından rol bazlı yetkilendirmenin sınırlarını daha da esnetebilmek ve uygulamada işlev görecek olan kullanıcının […]

Bir cevap yazın

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

*