Asp.net core mvc’de görünümlerde policy yetkilendirme-Sayfa görünümünde Claims based authorization kontrol

Herkes  Yazar Herkes Yazar

22 Eylül 2019 Yazılım Dilleri (127) /Asp.Net Core (2) (23)

Asp.net core mvc’de görünümlerde policy yetkilendirme-Sayfa görünümünde Claims based authorization kontrol

Paylaşmak güzeldir. Lütfen sizde paylaşın...


 

Asp.net core mvc’de görünümlerde policy yetkilendirme

Yetkilendirme kullanımı öncesi eğer role ve calims kullanımı hakkında bilginiz yok ise https://www.herkesyazar.net/514-rol-tabanli-yetkilendirme---talep-temelli

linkteki makalemizi okumanızı tavsiye ederim.

 

asp.net core mvc içindeki görünümlerde yetkilendirme kontrollerinin nasıl yapıldığını tartışacağız Bu teknik, oturum açan kullanıcının bunlara erişip erişmediğine bağlı olarak UI öğelerini göstermek veya gizlemek istiyorsanız çok kullanışlıdır.

 

Asp.net çekirdek MVC içinde görünümlerde Rol tabanlı yetkilendirme onay

 yönetme navigasyon menüsünde kullanıcı giriş yaptığında yalnızca 
Yönetici rolü ve üyesinin görebilmei için;

Navigation menüsü view görünümünde. Kullanıcının imzalanmış olup olmadığını kontrol etmek için ASP.NET Core SignInManager servisini enjekte edin.

@using Microsoft.AspNetCore.Identity
@inject SignInManager<ApplicationUser> SignInManager
  • SignInManager hizmeti IsSignedIn(user) yöntemi , kullanıcı oturum açtığında true değerini döndürür .Aksi halde false.
  • Kullanıcının verilen rolün bir üyesi olup olmadığını kontrol etmek için IsInRole () yöntemini kullanın. 
  • @if (SignInManager.IsSignedIn(User) && User.IsInRole("Admin"))
    {
        <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink"
               data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                Manage
            </a>
            <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                <a class="dropdown-item"
                   asp-controller="Administration" asp-action="ListUsers">
                    Users
                </a>
                <a class="dropdown-item"
                   asp-controller="Administration" asp-action="ListRoles">
                    Roles
                </a>
            </div>
        </li>
    }

Claims based authorization check in views in asp.net core mvc

ListRoles sayfasında görüntülemek istediğiniz Düzenleme , oturum açan kullanıcının eğer EditRolePolicy hakkına sahip oluup olmadığı ise;

Yani EditRolePolicy  hakkına sahip ise düzenle butonu görünecek ve get post metodlarına erişim yapabilecektir. Dolayısı ile oturum açan kullanıcının Rol Düzenleme talebine sahip olması gerekir .

 

public void ConfigureServices(IServiceCollection services)
        {
....
 
#region Claims -Policy
            //Daha fazla detaylı bilgi için:https://csharp-video-tutorials.blogspot.com/2019/08/role-based-authorization-vs-claims.html
            //veya:
            //Bir talep politikası oluşturma ve kaydetme, genellikle, Başlangıç sınıfının ConfigureServices() yönteminde bir adımda yapılır .
            //Get Post Metodlarına attribute eklenerek kullanılır;
            // [HttpPost]
            // [Authorize(Policy = "DeleteRolePolicy")]
            // public async Task<IActionResult> DeleteRole(string id)
            

            services.AddAuthorization(options =>
            {
                options.AddPolicy("DeleteRolePolicy",
                    policy => policy.RequireClaim("Delete Role")
                                    //.RequireClaim("Create Role")//Bu politika gerekliliklerini yerine getirmek için, oturum açan kullanıcının her iki istemde bulunması gerekir
                    //tek sistem için gerekli satırdan teki bulunur diğerini silmek gerekir.
                    );
                options.AddPolicy("EditRolePolicy", policy => policy.RequireClaim("Edit Role"));
                options.AddPolicy("AdminRolePolicy", policy => policy.RequireClaim("Admin"));
            });


//*** !! AspNetUserClaims Table ClaimType değeri ile ClaimValue değerlerinin her ikisinini //de kontrol ederek kullanmak istersek
//oturum açan kullanıcının , ClaimType "Rolü Düzenle" ve  ClaimValue="true" değerine sahip //olmasını kontrol edebilir bu şatların sağlanmasını isteyebiliriz.
//Bu şekilde bir kullanımın veri tabanına kayıt ve kontrol işleleri için değişiklikler yapılması gerektiğindene https://www.youtube.com/watch?v=I2wgxzLbESA&list=PL6n9fhu94yhVkdrusLaQsfERmL_Jh4XmU&index=98 linkteki videonun izlenmesi ve uygulanması önem arz etmektedir.
//.Bu durumda ekleyeceğimiz policy aşağıdaki gibi olmalıdır.

services.AddAuthorization (options =>
{
    options.AddPolicy ( "EditRolePolicy" ,
        policy => policy.RequireClaim ( "Rolü Düzenle" , "true" ));
});
//** Diğer bir kullanım şekli olarak da İzin verilen değerlerin bir listesi de //belirtilebilir. Aşağıdaki politikayı yerine getirmek için giriş yapmış kullanıcının ABD, //Hindistan veya İngiltere değerinde Ülke talebinde bulunması gerekir.

//Birden fazla şartı kontrol ederek yetkilendirme politakası için uygun olanı aşağıdaki //kullanım olacaktır.

services.AddAuthorization (options =>
{
    options.AddPolicy ( "AllowCountryPolicy" ,
        policy => policy.RequireClaim ( "Ülke" , "ABD", "Hindistan", "İngiltere" ));
});
//ClaimType karşılaştırması büyük / küçük harf duyarlıdır; ClaimValue karşılaştırması büyük // küçük harf duyarlıdır.

 //Gerekirse de; options.AddPolicy("AdminRolePolicy", policy => policy.RequireRole("Admin"));
  //veya ptions.AddPolicy("SuperAdminPolicy", policy =>
  //   policy.RequireRole("Yönetici", "Kullanıcı", "Yönetici")); şeklinde kullanılabilir.

....
}
            #endregion

Oturum açmış kullanıcının EditRolePolicy’yi karşılayıp karşılamadığını kontrol etmek için view 'e IAuthorizationService hizmetini enjekte edin.

@using Microsoft.AspNetCore.Authorization
@inject IAuthorizationService authorizationService;

 

@if ((await authorizationService.AuthorizeAsync(User, "EditRolePolicy")).Succeeded)
{
    <a asp-controller="Administration" asp-action="EditRole"
       asp-route-id="@role.Id" class="btn btn-primary">
        Edit
    </a>
}

 

Yalnızca görünümlerdeki yetkilendirme denetimleri yeterli

UI öğelerini görünümde gösterip gizlememiz yeterli değildir. İlgili denetleyici eylemleri de korunmalıdır. Aksi takdirde, kullanıcı URL'yi doğrudan adres çubuğuna yazabilir ve kaynaklara erişebilir.

Örneğimizde, Düzenle düğmesi gizlenmiş olmasına rağmen , kullanıcı EditRole eylemine ulaşmak için doğrudan aşağıdaki URL'yi yazabilir

http://localhost:0001/Administration/EditRole/RoleIdGuid buraya yazılarak erişim sağlanabilir.


İlgili denetleyici eylemini de koruduğunuzdan emin olun.İlgili get ve psot metodlarınıza 
şağıdaki gibi  attrubute eklemelisiniz.;

[Authorize(Policy = "EditRolePolicy")]
public async Task<IActionResult> EditRole(string id)
{
    // Code
}

Birden fazla view da kullanmak için IAuthorizationService uygulamasını _ViewImports.cshtml  dosyasına ekeyerek servis enjeksiyonu yapabilirsiniz. _ViewImports.cshtml dosyasını içe aktarmayı unutmayın, böylece her görünümde içe aktarmanız gerekmez.

Paylaşmayı unutmayın...

İyi çalışmalar.


Paylaşmak güzeldir. Lütfen sizde paylaşın...



Herkesyazar Ara