Sử dụng dây ma thuật mang lại cho bạn sự linh hoạt để khai báo nhiều vai trò trong các thuộc tính Authorize (ví dụ [Authorize (Roles = "Admin, Moderator")] mà bạn có xu hướng giảm khi bạn đi đến một giải pháp mạnh mẽ gõ. nhưng đây là cách bạn có thể duy trì sự linh hoạt này trong khi vẫn nhận được tất cả những gì mạnh mẽ gõ
Xác định vai trò của bạn trong một enum có sử dụng lá cờ bit:.
[Flags]
public enum AppRole {
Admin = 1,
Moderator = 2,
Editor = 4,
Contributor = 8,
User = 16
}
Override AuthorizeAttribute:
0.123.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyAuthorizeAttribute : AuthorizeAttribute {
public AppRole AppRole { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext) {
if (AppRole != 0)
Roles = AppRole.ToString();
base.OnAuthorization(filterContext);
}
}
Bây giờ nếu bạn có thể sử dụng MyAuthorizeAttribute như thế này:
[MyAuthorize(AppRole = AppRole.Admin | AppRole.Moderator | AppRole.Editor)]
public ActionResult Index() {
return View();
}
Hành động trên sẽ chỉ cho phép người dùng có trong ít nhất một trong những vai trò niêm yết (Quản trị, Điều hành, hoặc Editor). Hành vi này giống với AuthorizeAttribute mặc định của MVC, ngoại trừ không có chuỗi ma thuật.
Nếu bạn sử dụng kỹ thuật này, đây là một phương pháp khuyến nông trên IPrincipal mà cũng có thể hữu ích:
public static class PrincipalExtensions {
public static bool IsInRole(this IPrincipal user, AppRole appRole) {
var roles = appRole.ToString().Split(',').Select(x => x.Trim());
foreach (var role in roles) {
if (user.IsInRole(role))
return true;
}
return false;
}
}
Bạn có thể sử dụng phương pháp mở rộng này như thế này:
public ActionResult Index() {
var allowed = User.IsInRole(AppRole.Admin | AppRole.Moderator | AppRole.Editor);
if (!allowed) {
// Do Something
}
return View();
}
Tôi đã đi với giải pháp này do nó đơn giản. Những thay đổi mã là tối thiểu, vì tôi chỉ phải thay thế các chuỗi mã hóa cứng với các tham chiếu liên tục. – MikeWyatt