ASP.NET MVC Bagaimana AuthorizeAttribute mendukung pemeriksaan Peran?

Di pengontrol saya, saya memiliki kode seperti [Authorize(Roles = "Administrators")] yang dianotasi di atas beberapa tindakan, dan saya ingin tahu bagaimana AuthorizeAttribute menggunakan parameter Peran (implementasi mekanisme pemeriksaan). Tujuan saya adalah membuat ekstensi kelas ini, yang disebut PrivilegeAttribute misalnya, sehingga saya dapat memberi anotasi pada tindakan seperti [Privilege(Privileges = "read")]. Di kelas ini, saya akan memeriksa apakah Peran pengguna memiliki setidaknya satu hak istimewa dalam filter khusus ini (read dalam contoh ini). Saya telah membuat hubungan antara peran dan hak istimewa dalam kode dan database, dan bantuan yang saya perlukan adalah memeriksa apakah peran tersebut terkait dengan hak istimewa.

Saya mencoba melihat apakah informasi itu ada di HttpContextBase.User.Identity tetapi saya tidak dapat menemukannya. Terima kasih.


person ITWorker    schedule 12.08.2016    source sumber
comment
Lihat pertanyaan ini: stackoverflow.com/questions/5117782/. Saya juga menemukan panduan ini: diaryofaninja.com/blog/2011/07/24/   -  person Eitan K    schedule 12.08.2016


Jawaban (1)


Jika Anda tidak memerlukan atribut khusus Anda sendiri dan dapat menggunakan atribut orang lain, maka saya sarankan untuk menggunakan paket Thinktecture.IdentityModel.Owin.ResourceAuthorization.Mvc seperti yang dijelaskan di sini

Postingan Blog oleh Dominick Baier

dan di sini

Kode Contoh Git Hub untuk Paket

jadi pada dasarnya berfungsi seperti ini: Anda meletakkan atribut di atas tindakan Anda seperti ini:

[ResourceAuthorize("View", "Customer")]

Argumen pertama adalah nama Tindakan yang akan diperiksa, argumen kedua adalah nama atribut.

Kemudian Anda memperoleh ResourceAuthorizationManager dalam kode Anda dan mengganti Metode CheckAccessAssync

public class MyAuthorization : ResourceAuthorizationManager
{
    public override Task<bool> CheckAccessAsync(ResourceAuthorizationContext context)
    {
        var resource = context.Resource.First().Value;
        var action =  context.Action.First().Value;

        // getting the roles that are connected to that resource and action
        // from the db. Context could of course be injected into the 
        // constructor of the class. In my code I assume that the table
        // thank links roles, resources and actions is called Roles ToActions
        using(var db = MyContext())
        var roles = db.RolesToActions   // Use your table name here
         .Where(r => r.Resource == resource && r.Action == action).ToList();

        foreach(var role in roles)
        {
            if(context.Principal.IsInRole(role.Name)
            {
                return Ok();
            }
        }

        return Nok();
    }
 }

}

Jadi saya harap ini membantu. Namun, jika Anda lebih suka menerapkan atribut Anda sendiri, gunakan kode sumber dari rel Repositori GitHub ResourceAuthorization seharusnya menjadi titik awal yang baik

person Andre Kraemer    schedule 13.08.2016