【问题标题】:MVC Action filter across all the application跨所有应用程序的 MVC 操作过滤器
【发布时间】:2010-11-04 17:17:34
【问题描述】:

我正在尝试创建授权操作过滤器,它将在每个请求上触发以检查用户是否被允许做一些事情。

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

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;
   }
}

还有需要调用函数的类,但不是..

public class AuthenticationActionFilter : IGlobalAuthorizationFilter
{
    public bool ShouldBeInvoked(System.Web.Mvc.ControllerContext controllerContext)
    {
        return true;
    }

    public void OnAuthorization(System.Web.Mvc.AuthorizationContext filterContext)
    {

    }
}

还有,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);

所以,正如我所说,我的问题是函数:“ShouldBeInvoked”从未调用过。

有什么帮助吗?

【问题讨论】:

    标签: asp.net-mvc filter unity-container action


    【解决方案1】:

    我相信这个过滤器只会在用 [Authorize] 修饰的操作上调用,你希望这个过滤器运行的方法上有这个吗?

    【讨论】:

      猜你喜欢
      • 2010-11-23
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2012-09-11
      相关资源
      最近更新 更多