2

我有 2 个过滤器正在尝试使用 Ninject 的BindFilter<>语法应用,并且它们的依赖注入成功地应用了它们。问题在于这样一个事实,即一个人会确定当前用户是谁并绑定该用户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 排列和顺序设置,甚至以不同的顺序绑定它们,但没有任何效果......我做错了什么?

4

1 回答 1

3

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

于 2012-10-31T10:26:51.100 回答