ASP.NET MVC 5 Rol bazlı yetki kontrolü


IdentityRole sınıfı ASP.NET için kimlik doğrulama altyapısını (Authentication) sağlar. Ancak ciddi bir sıkıntımız var zira sayfalarımız için rol kontrolünü (Authorization) direk kullanmak mümkün değil. Bu noktada aşağıdaki adımları izlemeniz yeterli.

Ayrıca orjinal makaleyi ingilizce olarak incelemek isteyenler için orjinal linki vermekte fayda var : http://www.dotnetcurry.com/aspnet-mvc/1102/aspnet-mvc-role-based-security

1- (Model) AccountViewModels.cs classı login, register gibi yetki kontrolü için kullanılan modelleri barındırıyor. bu nedenle register adımında yer almayan rol tanımını bu class içindeki register adımında kullanılan RegisterViewModel modeline yetki bilgisini taşıyacak alanı ekleyerek başlıyoruz.

public string Name { get; set; }

bu kısım aynı zamanda proje code first olduğu için veri tabanı oluşturulurken ilgili kolonun oluşturulmasını sağlayacak.

NOT : bu yapıyı Aktif olarak kullanabilmek için Asp.net in tablolarında rol definitionlarının olması gerekiyor. 
  1. Bu amaçla rol tablosunu besleyecek viev-create opsiyonlu sayfa oluşturabilir.
  2. Dataları manuel girebilir.
  3. ApplicationStart adımında (global.asax) rol tanımlarının varlığını kontrol ederek insert edecek bir kod yazabilirsiniz. 

Uygulamanızın yapısına rol yapısının değişme olasılığına ve keyfinize göre bu adım size bağlı. 

2- (Controller)  Rol tanımlarının yapıldığını düşünürsek artık, AccountController sınıfına global değişken olarak aşağıdaki tanımı ekliyoruz, ve constructor methodu içinde “new” leyerek instance ını oluşturuyoruz:
ApplicationDbContext context;
sonrasında “Register” view’i için get methodunda aşağıdaki şekilde rol listesini viewbag 'e ekliyoruz :

ViewBag.Name = new SelectList(context.Roles.ToList(), "Name", "Name");

Seçimi veritabanına beslememiz de gerektiği için aynı view’ın post methoduna register işlemi sonrası başarılı olduğu durum için (basit bir if condition eklemesi ile) aşağıdaki eklentiyi yapıyoruz:

await this.UserManager.AddToRoleAsync(user.Id, model.Name);

3- (View) Register view’ı içinde uygun bir noktaya aşağıdaki kod ile rol seçimi için dropdownlist ekleyebiliriz:       

<div class="form-group">
    @Html.Label("Select Your User Type", new { @class = "col-md-2 control-label" })
    <div class="col-md-10">
        @Html.DropDownList("Name", (IEnumerable<SelectListIem>)ViewBag.Name)
    </div>
</div>

4- (Class) Artık kullanıcı oluşturma adımını rol tanımları ile veri tabanını besleyecek hale getirdik, Ancak taktir edersiniz ki, henüz doğrulama kısmını yapmadık bu amaçla projemize yeni bir class olarak, aşagıdaki kodu ekliyoruz.


AuthorizeAttribute sınıfını kullanan ve OnAuthorization()  override ederek, IsUserAuthorized() yardımı ile ilgili özellik kontrolü sonrası normal akışı devam ettiren yada hata durumunda ilave edeceğimiz hata sayfasına yönlendiren bir kod parçacığı olarak işlev görecek, bunun için yetki kontrolü yapmak istediğimiz sayfanın get methoduna property olarak aşağıdaki ifadeyi eklemeniz yeterli olacaktır:

[AuthLog(Roles = "Admin")]

5- (View) son olarak, hata durumunda mesajımızı göstermek adına shared viewlerin olduğu klasöre AuthorizeFailed.cshtml adında, aşağıdaki view i ekliyoruz :

@{
ViewBag.Title = "AuthorizeFailed";
}
<h2>Authorize Failed</h2>
@ViewData["Message"]

Böylece beş adımda rol bazlı kullanıcı oluşturma ve yetki kontrolünü sağlayacak yapımızı kurmuş oluyoruz.

Yorumlar

Yazılar

Kotlin - 1 - Giriş

Genesys Nuance-ASR Entegrasyonu Port Kullanımı

Kotlin - 5 - Dönüşler ve Atlamalar (Returns and Jumps)