Ninject授权与Action Filter绑定顺序

时间:2012-10-31 09:22:35

标签: asp.net-mvc-4 ninject action-filter authorize-attribute custom-action-filter

我正在尝试使用Ninject的BindFilter<>语法应用2个过滤器,并且它们正在成功应用它们的依赖注入。问题在于,当前用户是谁并且绑定了InRequestScope,并且在检查维护授权时必须在第二个用户之前运行 - 否则它不知道您是哪个用户指的是。

NinjectWebCommon.cs中的过滤器绑定如下所示:

kernel.BindFilter<CurrentUserFilter>(FilterScope.Global, 0).InRequestScope();
kernel.BindFilter<SetupRightsAttribute>(FilterScope.Controller, 1).WhenControllerType<MaintenanceController>().InRequestScope();

所以在维护控制器中,我想要第一个运行然后第二个运行;在其他所有内容中只有第一个 - 这是有效的,第二个仅在浏览维护控制器中的内容时使用。

2个过滤器被声明为这样(不相关的细节除外)

public class CurrentUserFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext filterContext)
    // implementation - breakpoint 1
}

public class SetupRightsAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    // implementation - breakpoint 2
}

我期待断点1被击中然后断点2,但由于某种原因它首先总是断点2 - 因为它此时不知道用户它告诉我我没有授权。

我尝试了许多不同的FilterScope和订单设置排列,甚至以不同的顺序绑定它们,但没有任何作用......我做错了什么?

1 个答案:

答案 0 :(得分:3)

授权过滤器在操作过滤器之前执行,因为授权在MVC执行管道中比处理操作更早。