Фильтр действий MVC по всему приложению - PullRequest
2 голосов
/ 04 ноября 2010

Я пытаюсь создать фильтр действий авторизации, который будет срабатывать при каждом запросе, чтобы проверить, разрешено ли пользователю выполнять какие-либо действия.

Итак, я создал следующие классы / интерфейсы:

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» никогда не вызывается.

Любая помощь?

1 Ответ

0 голосов
/ 17 апреля 2011

Я полагаю, что этот фильтр будет вызываться только для действий, помеченных [Authorize], есть ли у вас методы, которые вы хотите, чтобы этот фильтр запускал?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...