2011-10-20 17 views
11

Trong ứng dụng MVC của tôi, tôi có một vài vai trò khác nhau: quản trị, Tổng giám dùng, vv, vvan MVC xem

Tôi biết rằng tôi có thể áp dụng bảo mật để điều khiển của tôi qua các thuộc tính Authorize:

[Authorize(Roles="Admin")] 
public ActionResult Create() 
{ 
    return View(); 
} 

Nhưng tôi cũng cần phải áp dụng một số an ninh để Views để không hiển thị phần nhất định của Xem các vai trò nhất định:

@if(User.IsInRole("Admin")) 
{ 
    @Html.ActionLink("Create", "Create") 
} 

là nó tốt hơn để làm điều đó theo cách trên, hoặc xử lý này loại securi ty trong ViewModel:

public ActionResult Index() 
{ 
    var model = new IndexViewModel(); 

    model.CanCreate = User.IsInRole("Admin"); 

    return View(model); 
} 

View: 
@(Model.CanCreate) 
{ 
    @Html.ActionLink("Create", "Create") 
} 

Phương pháp thứ hai có bất kỳ lợi ích nào so với thứ nhất hoặc chỉ là một điều ưu tiên?

+0

Tôi nghĩ rằng phương pháp đầu tiên là tốt hơn. – Birey

Trả lời

6

Cách thứ hai được ưu tiên hơn, vì logic kinh doanh của bạn sẽ vẫn ở mức mô hình.

Trong ví dụ của bạn, logic nghiệp vụ rất đơn giản. Tuy nhiên, hãy tưởng tượng rằng các yêu cầu đã thay đổi và giờ đây không chỉ Quản trị viên mới có thể tạo nội dung, mà cả Người dùng chung đã đăng ký hơn 1 tháng trước. Với logic nghiệp vụ trong chế độ xem, bạn phải cập nhật tất cả các chế độ xem của mình.

1

Bạn có thể cần cả ...

Lưu ý rằng một trong 2 mình sẽ không được an toàn, người dùng có thể có thể để xây dựng các URL cho ActionLink trong các trình duyệt thanh địa chỉ. Vì vậy, bạn hoàn toàn cần thuộc tính cho bảo mật.

Cách thứ hai là vấn đề thân thiện với người dùng hoặc thiết kế giao diện người dùng. Có thể bạn muốn người dùng có thể nhấp vào Tạo và sau đó có lựa chọn để đăng nhập khác nhau.

+0

Tôi không có nghĩa là tôi sẽ không đặt [Ủy quyền] vào các hành động. Câu hỏi đặt ra là tôi nên xử lý bảo mật Chế độ xem của mình bằng cách bao gồm các thuộc tính trong mô hình hoặc trực tiếp đưa các cuộc gọi User.IsInRole() vào chế độ xem của tôi. – Dismissile

0

Kiểm tra ủy quyền trong bộ điều khiển của bạn và chuẩn bị Chế độ xem cho chế độ xem theo quy tắc vai trò của bạn.

Chế độ xem được sử dụng để chỉ hiển thị dữ liệu. Vì vậy, imo, họ không phải làm vai trò kiểm tra vv ..

Vì vậy, hãy chuẩn bị ViewModel với dữ liệu cần có và để Chế độ xem chỉ hiển thị nó. (thuộc tính boolean bạn đang sử dụng đủ imo)

3

Một cách tôi đã làm trước đây là tạo bộ lọc hành động kế thừa từ AuthorizeAttribute. Bộ lọc có thể được gọi là một cái gì đó như DisplayIfAuthorizedAttribute, và ngoài các thuộc tính AuthorizeAttribute tiêu chuẩn, có một thuộc tính được gọi là ViewNameIfNotAuthorized.

Thuộc tính gọi phương thức cơ sở để thực hiện ủy quyền và nếu thuộc tính không thành công, hãy trả về chế độ xem ViewNameIfNotAuthorized. Nếu không, nó cho phép phương thức hành động tiến hành bình thường.

Sau đó, bạn sẽ hiển thị các chế độ xem một phần này thông qua các phương thức hành động và gọi phương thức hành động thông qua Html.RenderAction hoặc Html.Action trong chế độ xem cha mẹ của bạn. Các phương thức hành động đó sẽ được trang trí với thuộc tính.

Bây giờ bạn đã có một cách tiêu chuẩn hóa để thực hiện điều này và không có mã ủy quyền gây ô nhiễm cho nội bộ của các phương pháp hành động của bạn.

Đây là những gì các bộ lọc sẽ trông như thế:

public class DisplayIfAuthorizedAttribute : System.Web.Mvc.AuthorizeAttribute 
{ 
    private string _ViewNameIfNotAuthorized; 
    public DisplayIfAuthorizedAttribute(string viewNameIfNotAuthorized = null) 
    { 
     _ViewNameIfNotAuthorized = viewNameIfNotAuthorized; 
    } 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     bool isAuthorized = base.AuthorizeCore(filterContext.HttpContext); 

     if (!isAuthorized) 
     { 
      filterContext.Result = GetFailedResult(); 
     } 
    } 

    private ActionResult GetFailedResult() 
    { 
     if (!String.IsNullOrEmpty(_ViewNameIfNotAuthorized)) 
     { 
      return new ViewResult { ViewName = _ViewNameIfNotAuthorized }; 
     } 
     else 
      return new EmptyResult(); 
    } 
} 

phương pháp hành động của bạn sẽ được trang trí như:

[DisplayIfAuthorized("EmptyView", Roles="Admin")] 
     public ViewResult CreateLink() 
     { 
      return View("CreateLink"); 
     } 
Các vấn đề liên quan