13

Tôi đang xây dựng một CMS đơn giản trong đó vai trò được đặt động trong bảng quản trị. Cách hiện tại của việc cho phép một phương thức điều khiển, thêm [Authorize(Roles="admin")] chẳng hạn, do đó không còn đủ. Mối quan hệ vai trò-hành động phải được lưu trữ trong cơ sở dữ liệu, để người dùng cuối có thể dễ dàng cho/lấy quyền truy cập/từ những người khác trong bảng quản trị. Làm thế nào tôi có thể thực hiện điều này?ASP.NET MVC - Ủy quyền động

Trả lời

0

Đó chính xác là những gì các thành viên ASP.NET/hồ sơ công cụ nào cho bạn. Và nó hoạt động với thuộc tính Authorize.

Nếu bạn muốn cuộn của riêng mình, bạn có thể tạo bộ lọc hành động tùy chỉnh giống như hành vi của bộ lọc hành động Ủy quyền tiêu chuẩn. Mã giả bên dưới.

public MyAuthorizeAttribute : ActionFilterAttribute 
{ 
    public string MyRole { get; set; } 

    public void OnActionExecuting(ControllerContext context) 
    { 
     if (!(bool)Session["userIsAuthenticated"]) 
     { 
      throw new AuthenticationException("Must log in."); 
     } 

     if (!Session["userRoles"].Contains(MyRole)) 
     { 
      throw new AuthenticationException("Must have role " + MyRole); 
     } 
    } 
} 
+0

Tôi khá mới đối với nội dung đó, nhưng tôi đã thấy ví dụ về vai trò được chỉ định cụ thể trong mã và tôi KHÔNG muốn điều đó. ví dụ, một số khách hàng có thể có một nhóm người dùng được gọi là "Kỹ sư" có đặc quyền cụ thể. Tôi muốn anh ta có thể thiết lập chúng từ bảng quản trị, mà không cần chạm vào bất kỳ đoạn mã nào. Ngay bây giờ, tôi không thể thấy cách bạn có thể sử dụng thuộc tính Authorize chuẩn cho rằng – xantrus

+0

Cảm ơn, tôi sẽ kiểm tra nó ra – xantrus

+0

Vậy thì bạn phải thêm tra cứu trong cơ sở dữ liệu của mình tại một thời điểm nào đó, có thể khớp với người dùng và bộ điều khiển/tên hành động với quy tắc truy cập bạn có trong DB. Hay đại loại thế. – rmac

0

Vai trò - mối quan hệ hành động phải được lưu trữ trong cơ sở dữ liệu

Bạn sẽ phải kiểm tra an ninh của bạn trong phương pháp điều khiển, trừ khi bạn muốn phân lớp AuthorizeAttribute để nó ngước lên các vai trò từ cơ sở dữ liệu cho bạn.

18

Nếu bạn muốn kiểm soát quá trình ủy quyền, bạn nên phân loại AuthorizeAttribute và ghi đè phương thức AuthorizeCore. Sau đó, chỉ cần trang trí bộ điều khiển của bạn với CmsAuthorizeAttribute thay vì mặc định.

public class CmsAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override virtual bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     IPrincipal user = httpContext.User; 
     IIdentity identity = user.Identity; 

     if (!identity.IsAuthenticated) { 
      return false; 
     } 

     bool isAuthorized = true; 
     // TODO: perform custom authorization against the CMS 


     return isAuthorized; 
    } 
} 

Nhược điểm là bạn sẽ không có quyền truy cập vào IoC do ctor tiêm, vì vậy bạn sẽ phải yêu cầu bất kỳ phụ thuộc nào từ vùng chứa trực tiếp.

+0

Nhược điểm của việc nhận phụ thuộc từ container trực tiếp là gì? Tôi đã phải làm điều này để thực hiện RoleProvider của tôi ... – Haroon

+1

@Haroon - Nhược điểm là một trong những thiết kế. Nó thường được coi là thực hành tốt nhất cho mã để vẫn không biết gì về IoC Container để giảm sự phụ thuộc của bạn vào nó (ví dụ, bạn có thể muốn sử dụng lại mã của bạn trên WP7, nơi một container dựa trên phản chiếu thường tránh được vì lý do hiệu suất). –

+0

@Haroon - Có nói rằng, MVC 3 hỗ trợ tính năng lọc thuộc tính thông qua thuộc tính được trang trí thuộc tính. Nó vẫn đòi hỏi kiến ​​thức về các container, nhưng nó dễ dàng hơn chế giễu. –