我正在尝试使用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和订单设置排列,甚至以不同的顺序绑定它们,但没有任何作用......我做错了什么?
答案 0 :(得分:3)
授权过滤器在操作过滤器之前执行,因为授权在MVC执行管道中比处理操作更早。