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?
chỉ là vé, cheers – redsquare
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
Để 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