ASP.NET MVC AuthorizeAttribute รองรับการตรวจสอบบทบาทอย่างไร

ในคอนโทรลเลอร์ของฉัน ฉันมีโค้ดเช่น [Authorize(Roles = "Administrators")] ที่มีคำอธิบายประกอบอยู่เหนือการดำเนินการบางอย่าง และฉันต้องการทราบว่า AuthorizeAttribute ใช้พารามิเตอร์ Roles อย่างไร (การนำกลไกการตรวจสอบไปใช้) เป้าหมายของฉันคือการสร้างส่วนขยายของคลาสนี้ที่เรียกว่า PrivilegeAttribute เป็นต้น เพื่อที่ฉันจะสามารถใส่คำอธิบายประกอบการดำเนินการเช่น [Privilege(Privileges = "read")] ได้ ในชั้นเรียนนี้ ฉันจะตรวจสอบว่าบทบาทของผู้ใช้มีสิทธิ์อย่างน้อยหนึ่งรายการในตัวกรองที่กำหนดเองนี้หรือไม่ (read ในตัวอย่างนี้) ฉันได้สร้างการเชื่อมโยงระหว่างบทบาทและสิทธิพิเศษในโค้ดและในฐานข้อมูลแล้ว และสิ่งที่ฉันต้องการความช่วยเหลือคือการตรวจสอบว่าบทบาทนั้นเชื่อมโยงกับสิทธิ์หรือไม่

ฉันลองดูว่ามีข้อมูลนั้นอยู่ใน HttpContextBase.User.Identity หรือไม่ แต่หาไม่พบ ขอบคุณ


person ITWorker    schedule 12.08.2016    source แหล่งที่มา
comment
ลองดูคำถามนี้: stackoverflow.com/questions/5117782/ ฉันยังพบคู่มือนี้: diaryofaninja.com/blog/2011/07/24/   -  person Eitan K    schedule 12.08.2016


คำตอบ (1)


หากคุณไม่ต้องการแอตทริบิวต์ที่กำหนดเองของคุณเองและสามารถใช้ชีวิตโดยใช้แอตทริบิวต์ของคนอื่นได้ ฉันขอแนะนำให้ใช้แพ็คเกจ Thinktecture.IdentityModel.Owin.ResourceAuthorization.Mvc ตามที่อธิบายไว้ที่นี่

บล็อกโพสต์โดย Dominick ไบเออร์

และที่นี่

โค้ดตัวอย่าง Git Hub สำหรับแพ็คเกจ

โดยพื้นฐานแล้วมันใช้งานได้ดังนี้: คุณใส่แอตทริบิวต์ไว้เหนือการกระทำของคุณดังนี้:

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

อาร์กิวเมนต์แรกคือชื่อของการดำเนินการที่จะตรวจสอบ ส่วนอาร์กิวเมนต์ที่สองคือชื่อของแอตทริบิวต์

จากนั้น คุณจะได้รับมาจาก ResourceAuthorizationManager ในโค้ดของคุณและแทนที่วิธี 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();
    }
 }

}

ดังนั้นฉันหวังว่านี่จะช่วยได้ หากคุณต้องการใช้แอตทริบิวต์ของคุณเอง มากกว่าซอร์สโค้ดจาก ResourceAuthorization GitHub Repository ควรเป็นจุดเริ่มต้นที่ดี

person Andre Kraemer    schedule 13.08.2016