Asp.net mvc 跨所有应用程序的MVC操作筛选器

Asp.net mvc 跨所有应用程序的MVC操作筛选器,asp.net-mvc,filter,unity-container,action,Asp.net Mvc,Filter,Unity Container,Action,我正在尝试创建授权操作过滤器,该过滤器将在每次请求时启动,以检查用户是否被允许执行某些操作 因此,我创建了以下类/接口: public interface IGlobalAuthorizationFilter : IGlobalFilter, IAuthorizationFilter { } public interface IGlobalFilter { bool ShouldBeInvoked(ControllerContext controllerContext); } p

我正在尝试创建授权操作过滤器,该过滤器将在每次请求时启动,以检查用户是否被允许执行某些操作

因此,我创建了以下类/接口:

public interface IGlobalAuthorizationFilter : IGlobalFilter, IAuthorizationFilter
{
}


public interface IGlobalFilter
{
    bool ShouldBeInvoked(ControllerContext controllerContext);
}

 public class GlobalFilterActionInvoker : ControllerActionInvoker
{
    protected FilterInfo GlobalFilters;

    public GlobalFilterActionInvoker()
    {
        GlobalFilters = new FilterInfo();
    }

    public GlobalFilterActionInvoker(FilterInfo filters)
    {
        GlobalFilters = filters;
    }

    public GlobalFilterActionInvoker(IEnumerable<IGlobalFilter> filters)
        : this(new FilterInfo())
    {
        foreach (IGlobalFilter filter in filters)
            RegisterGlobalFilter(filter);
    }

    public FilterInfo Filters
    {
        get { return GlobalFilters; }
    }

    public void RegisterGlobalFilter(IGlobalFilter filter)
    {
        if (filter is IGlobalAuthorizationFilter)
            GlobalFilters.AuthorizationFilters.Add((IGlobalAuthorizationFilter) filter);
    }

    protected override FilterInfo GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
    {
        FilterInfo definedFilters = base.GetFilters(controllerContext, actionDescriptor);

        foreach (IAuthorizationFilter filter in Filters.AuthorizationFilters)
        {
            var globalFilter = filter as IGlobalFilter;
            if (globalFilter == null ||
                (globalFilter.ShouldBeInvoked(controllerContext)))
            {
                definedFilters.AuthorizationFilters.Add(filter);
            }
        }

        return definedFilters;
    }
}

public class ApplicationControllerFactory : DefaultControllerFactory
{
   private readonly IUnityContainer _container;

   public ApplicationControllerFactory(IUnityContainer container)
   {
        this._container = container;
   }

   protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
   {
 if ( controllerType == null )
 {
  throw new HttpException(404, "The file " + requestContext.HttpContext.Request.FilePath + " not found.");
 }

       IController icontroller = _container.Resolve(controllerType) as IController;
        if (typeof(Controller).IsAssignableFrom(controllerType))
        {
            Controller controller = icontroller as Controller;

            if (controller != null)
                controller.ActionInvoker = _container.Resolve<IActionInvoker>();

            return icontroller;
        }

        return icontroller;
   }
}
还有,Global.asax注册资料:

   IUnityContainer unityContainer = new UnityContainer();
   unityContainer.RegisterType<IUserService, UserManager>();
   unityContainer.RegisterType<IAppSettings, AppSettingsHelper>();
            unityContainer.RegisterType<ICheckAccessHelper, CheckAccessHelper>().Configure<InjectedMembers>().ConfigureInjectionFor<CheckAccessHelper>(new InjectionConstructor());
            unityContainer.RegisterType<IActionInvoker, GlobalFilterActionInvoker>().Configure<InjectedMembers>().ConfigureInjectionFor<GlobalFilterActionInvoker>(new InjectionConstructor());
            unityContainer.RegisterType<IGlobalAuthorizationFilter, AuthenticationActionFilter>();
   IControllerFactory unityControllerFactory = new ApplicationControllerFactory(unityContainer);
   ControllerBuilder.Current.SetControllerFactory(unityControllerFactory);
IUnityContainer unityContainer=newunitycontainer();
unityContainer.RegisterType();
unityContainer.RegisterType();
unityContainer.RegisterType().Configure().ConfigureInjectionFor(新的InjectionConstructor());
unityContainer.RegisterType().Configure().ConfigureInjectionFor(新的InjectionConstructor());
unityContainer.RegisterType();
IControllerFactory unityControllerFactory=新应用程序ControllerFactory(unityContainer);
ControllerBuilder.Current.SetControllerFactory(unityControllerFactory);
所以,正如我所说,我的问题是函数:“ShouldBeInvoked”从未调用过


有什么帮助吗?

我相信只有在用[Authorize]修饰的操作上才会调用此筛选器您希望此筛选器运行的方法上有吗?

我相信只有在用[Authorize]修饰的操作上才会调用此筛选器您希望此筛选器运行的方法上有吗

   IUnityContainer unityContainer = new UnityContainer();
   unityContainer.RegisterType<IUserService, UserManager>();
   unityContainer.RegisterType<IAppSettings, AppSettingsHelper>();
            unityContainer.RegisterType<ICheckAccessHelper, CheckAccessHelper>().Configure<InjectedMembers>().ConfigureInjectionFor<CheckAccessHelper>(new InjectionConstructor());
            unityContainer.RegisterType<IActionInvoker, GlobalFilterActionInvoker>().Configure<InjectedMembers>().ConfigureInjectionFor<GlobalFilterActionInvoker>(new InjectionConstructor());
            unityContainer.RegisterType<IGlobalAuthorizationFilter, AuthenticationActionFilter>();
   IControllerFactory unityControllerFactory = new ApplicationControllerFactory(unityContainer);
   ControllerBuilder.Current.SetControllerFactory(unityControllerFactory);