14

Tôi đọc nhiều câu trả lời nhất có thể cho điều này, nhưng chúng dường như thiếu một chi tiết.Thuộc tính ràng buộc Ninject để lọc với các đối số xây dựng

Sự cố là khi liên kết bộ lọc hành động (với dịch vụ được bộ điều khiển đưa vào) vào thuộc tính tương ứng, tôi không thể tìm ra cách chuyển giá trị tham số/thuộc tính từ thuộc tính sang bộ lọc được liên kết. Dưới đây là mã, và dưới đây là giả mã dự định của tôi:

Lọc & Thuộc tính

public class AuthorizationFilter : IAuthorizationFilter 
{ 
    private readonly IAuthorizationService _authorizationService; 
    private readonly UserRoles _requiredRoles; // Enum 

    public AuthorizationFilter(IAuthorizationService authorizationService, UserRoles requiredRoles) 
    { 
     _authorizationService = authorizationService; 
     _requiredRoles = requiredRoles; 
    } 

    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.Session == null) 
      HandleUnauthorizedRequest(filterContext); 
     else { 
      var authorized = _authorizationService.IsUserInRole((UserSessionInfoViewModel) filterContext.HttpContext.Session["user"], _requiredRoles); 
      if (!authorized) 
       HandleUnauthorizedRequest(filterContext); 
      // else TODO: deal with cache... 
     } 
    } 
} 

public class RequireRolesAttribute : FilterAttribute 
{ 
    public readonly UserRoles RequiredRoles; 

    public RequireRolesAttribute(UserRoles requiredRoles) 
    { 
     RequiredRoles = requiredRoles; 
    }   
} 

Lọc/Thuộc tính Bindings

kernel.BindFilter<AuthorizationFilter>(FilterScope.Controller, 0) 
     .WhenControllerHas<RequireRolesAttribute>(); 
kernel.BindFilter<AuthorizationFilter>(FilterScope.Action, 0) 
     .WhenActionMethodHas<RequireRolesAttribute>(); 

này nên chắc chắn rằng bất kỳ điều khiển/hành động được trang trí với [RolesRequired] được liên kết với bộ lọc. Càng xa càng tốt. Bây giờ tôi muốn khai báo thông qua thuộc tính các role (giống như AuthorizeAttribute) và chuyển các giá trị đó vào bộ lọc thực sự thực hiện phép.

Intended/Fake Code:

[RequireRoles(UserRoles.Author)] 
public ActionResult Index() 
{ 
    // blah 
} 

Cụ thể,

gì nó làm để thông báo cho AuthorizationFilter trong những vai trò? Liệu bộ lọc/truy vấn ninject có được chuyển tới hàm tạo của thuộc tính không? Bộ lọc/bộ lọc có thể kéo chúng từ thuộc tính công khai thuộc tính không?

Để tham khảo, những bài viết này là một sự trợ giúp rất lớn, nhưng không trả lời này một điều:

Dependency Injection with Ninject and Filter attribute for asp.net mvc

Custom Authorization MVC 3 and Ninject IoC

BZ, Remo Gloor, những người khác ... làm thế nào tôi có thể hoàn thành điều này?

Trả lời

19

Tôi đã tìm ra (nhờ chỉ dẫn và tài liệu của Remo).

Sử dụng tiện ích mở rộng thích hợp .WithConstructorArgument cho dù bạn đang ràng buộc với Bộ điều khiển hoặc Bộ lọc hành động. Ví dụ ràng buộc lọc hành động của tôi trông như thế này:

kernel.BindFilter<AuthorizationFilter>(FilterScope.Action, 0) 
     .WhenActionMethodHas<RequireRolesAttribute>() 
     .WithConstructorArgumentFromActionAttribute<RequireRolesAttribute>("requiredRoles", o => o.RequiredRoles); 

Khi tôi hiểu được Func <> chữ ký, tất cả trở nên rõ ràng.Cách tốt nhất mà tôi tìm thấy để xử lý này là để

  1. làm loại cụ thể các phần mở rộng cho thuộc tính của tôi

    .WithConstructorArgumentFromActionAttribute<TAttribute>() 
    
  2. lấy giá trị từ đối tượng gọi lại (thuộc tính của bạn) qua lambda:

    ("argumentName", o => o.PropertyName) 
    
+1

chỉ là vé, cheers – redsquare

+0

Bất kỳ ý tưởng như những gì đã được thực hiện nếu lớp bắt nguồn từ 'FilterAttribute' có nhà xây dựng với nhiều thông số (ví dụ RequireRoles lớp trong ví dụ trên có nhà xây dựng với nhiều parametes) thì làm sao có thể các tham số được ánh xạ trong '.WithConstructorArgumentFromActionAttribute ()' ?? – Vipresh

+1

Để làm cho phương thức 'BindFilter <>()' có sẵn, bạn có thể thêm một tham chiếu đến 'Ninject.Web.Mvc.FilterBindingSyntax'. – bump

8

và để đưa BindFilter phương pháp mở rộng vào phạm vi không quên thêm;

using Ninject.Web.Mvc.FilterBindingSyntax; 
+15

Đây không phải là câu trả lời, nó sẽ được đăng như một bình luận cho câu trả lời giải pháp. – angularsen

+0

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. - [Từ đánh giá] (/ đánh giá/bài đăng chất lượng thấp/18739473) – diceler

Các vấn đề liên quan