Đã sử dụng các kỹ thuật xác thực và ủy quyền khác nhau trong nhiều thập kỷ, ứng dụng MVC hiện tại của tôi sử dụng phương pháp sau.
Yêu cầu bồi thường được sử dụng cho tất cả các ủy quyền. Người dùng được chỉ định một vai trò (có thể có nhiều vai trò nhưng tôi không cần điều này) - thêm bên dưới.
Như thông lệ, một lớp thuộc tính ClaimsAuthorize được sử dụng. Vì hầu hết các hành động của bộ điều khiển là CRUD, tôi có một quy trình trong quá trình tạo cơ sở dữ liệu đầu tiên là lặp lại tất cả các hành động của bộ điều khiển và tạo các loại xác nhận quyền sở hữu cho từng thuộc tính hành động của bộ điều khiển là Đọc / Chỉnh sửa / Tạo / Xóa. Ví dụ từ,
[ClaimsAuthorize("SomeController", "Edit")]
[HttpPost]
Để sử dụng trong Chế độ xem MVC, lớp bộ điều khiển cơ sở trình bày các mục túi xem
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
// get user claims
var user = filterContext.HttpContext.User as System.Security.Claims.ClaimsPrincipal;
if (user != null)
{
// Get all user claims on this controller. In this controler base class, [this] still gets the descendant instance type, hence name
List<Claim> claims = user.Claims.Where(c => c.Type == this.GetType().Name).ToList();
// set Viewbag with default authorisations on this controller
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);
}
Đối với menu trang web và các hành động không phải của người điều khiển, tôi có các yêu cầu khác. Ví dụ: liệu người dùng có thể xem một trường tiền tệ cụ thể hay không.
bool UserHasSpecificClaim(string claimType, string claimValue)
{
// get user claims
var user = this.HttpContext.User as System.Security.Claims.ClaimsPrincipal;
if (user != null)
{
// Get the specific claim if any
return user.Claims.Any(c => c.Type == claimType && c.Value == claimValue);
}
return false;
}
public bool UserHasTradePricesReadClaim
{
get
{
return UserHasSpecificClaim("TradePrices", "Read");
}
}
Vậy Roles phù hợp ở đâu?
Tôi có một bảng liên kết Vai trò với tập hợp các xác nhận quyền sở hữu (mặc định). Khi đặt ủy quyền người dùng, mặc định là cung cấp cho người dùng xác nhận vai trò của họ. Mỗi người dùng có thể có nhiều hoặc ít xác nhận quyền sở hữu hơn mặc định. Để làm cho việc chỉnh sửa trở nên đơn giản, danh sách xác nhận quyền sở hữu được hiển thị theo bộ điều khiển và hành động (liên tiếp), sau đó sẽ liệt kê các xác nhận quyền sở hữu khác. Các nút được sử dụng cùng với một chút Javascript để chọn một tập hợp các hành động nhằm giảm thiểu "nhấp chuột" cần thiết để chọn xác nhận quyền sở hữu. Khi Lưu, các xác nhận quyền sở hữu của người dùng sẽ bị xóa và tất cả các xác nhận quyền sở hữu đã chọn sẽ được thêm vào. Ứng dụng web chỉ tải xác nhận quyền sở hữu một lần, vì vậy bất kỳ thay đổi nào cũng phải nhắc tải lại trong dữ liệu tĩnh này.
Do đó, người quản lý có thể chọn xác nhận quyền sở hữu nào ở mỗi vai trò và xác nhận quyền sở hữu nào mà người dùng có sau khi đặt họ thành vai trò và xác nhận quyền sở hữu mặc định đó. Hệ thống chỉ có một số lượng nhỏ người dùng nên việc quản lý dữ liệu này rất đơn giản