ด้วยการใช้เทคนิคการพิสูจน์ตัวตนและการอนุญาตต่างๆมานานหลายทศวรรษแอปพลิเคชัน MVC ปัจจุบันของฉันใช้วิธีการดังต่อไปนี้
การอ้างสิทธิ์ใช้สำหรับการอนุญาตทั้งหมด ผู้ใช้จะได้รับมอบหมายหนึ่งบทบาท (สามารถทำได้หลายบทบาท แต่ฉันไม่ต้องการสิ่งนี้) - เพิ่มเติมด้านล่าง
ตามหลักปฏิบัติทั่วไปจะใช้คลาสแอตทริบิวต์ ClaimsAuthorize เนื่องจากการกระทำของตัวควบคุมส่วนใหญ่เป็น CRUD ฉันจึงมีกิจวัตรในการสร้างฐานข้อมูลรหัสแรกที่วนซ้ำการดำเนินการของตัวควบคุมทั้งหมดและสร้างประเภทการอ้างสิทธิ์สำหรับแอตทริบิวต์การดำเนินการของคอนโทรลเลอร์แต่ละรายการของ Read / Edit / Create / Delete เช่นจาก
[ClaimsAuthorize("SomeController", "Edit")]
[HttpPost]
สำหรับการใช้งานในมุมมอง MVC คลาสคอนโทรลเลอร์พื้นฐานจะแสดงรายการกระเป๋า
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var user = filterContext.HttpContext.User as System.Security.Claims.ClaimsPrincipal;
if (user != null)
{
List<Claim> claims = user.Claims.Where(c => c.Type == this.GetType().Name).ToList();
ViewBag.ClaimRead = claims.Any(c => c.Value == "Read");
ViewBag.ClaimEdit = claims.Any(c => c.Value == "Edit");
ViewBag.ClaimCreate = claims.Any(c => c.Value == "Create");
ViewBag.ClaimDelete = claims.Any(c => c.Value == "Delete");
}
base.OnActionExecuting(filterContext);
}
สำหรับเมนูเว็บไซต์และการดำเนินการอื่น ๆ ที่ไม่ใช่ตัวควบคุมฉันมีการอ้างสิทธิ์อื่น ๆ เช่นผู้ใช้สามารถดูช่องทางการเงินที่เฉพาะเจาะจงได้หรือไม่
bool UserHasSpecificClaim(string claimType, string claimValue)
{
var user = this.HttpContext.User as System.Security.Claims.ClaimsPrincipal;
if (user != null)
{
return user.Claims.Any(c => c.Type == claimType && c.Value == claimValue);
}
return false;
}
public bool UserHasTradePricesReadClaim
{
get
{
return UserHasSpecificClaim("TradePrices", "Read");
}
}
แล้วบทบาทไหนเหมาะสม?
ฉันมีตารางที่เชื่อมโยงบทบาทกับชุดการอ้างสิทธิ์ (ค่าเริ่มต้น) เมื่อตั้งค่าการอนุญาตผู้ใช้ค่าเริ่มต้นคือให้ผู้ใช้อ้างสิทธิ์ในบทบาทของตน ผู้ใช้แต่ละคนสามารถอ้างสิทธิ์ได้มากกว่าหรือน้อยกว่าค่าเริ่มต้น เพื่อให้การแก้ไขเป็นเรื่องง่ายรายการการอ้างสิทธิ์จะแสดงโดยตัวควบคุมและการดำเนินการ (ในแถว) พร้อมด้วยการอ้างสิทธิ์อื่น ๆ จะแสดงรายการ ปุ่มต่างๆใช้ร่วมกับ Javascript เพื่อเลือกชุดการดำเนินการเพื่อลด "การคลิก" ที่จำเป็นเพื่อเลือกการอ้างสิทธิ์ ในบันทึกการอ้างสิทธิ์ของผู้ใช้จะถูกลบและเพิ่มการอ้างสิทธิ์ที่เลือกทั้งหมด เว็บแอปพลิเคชันโหลดการอ้างสิทธิ์เพียงครั้งเดียวดังนั้นการเปลี่ยนแปลงใด ๆ ต้องแจ้งให้โหลดซ้ำภายในข้อมูลคงที่นี้
ผู้จัดการจึงสามารถเลือกได้ว่าจะอ้างสิทธิ์ใดในแต่ละบทบาทและการอ้างสิทธิ์ที่ผู้ใช้มีหลังจากตั้งค่าเป็นบทบาทและการอ้างสิทธิ์เริ่มต้นเหล่านั้น ระบบมีผู้ใช้เพียงเล็กน้อยดังนั้นการจัดการข้อมูลนี้จึงเป็นไปอย่างตรงไปตรงมา