2010-11-04 9 views
2

J'essaie de créer un filtre d'action d'autorisation qui se déclenchera à chaque requête pour vérifier si l'utilisateur est autorisé à faire certaines choses.Filtre d'action MVC sur l'ensemble de l'application

Alors, j'ai créé les classes/interfaces suivantes:

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

et la classe avec la fonction qui ont besoin d'être appelé, mais ce ne est pas ..

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

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

    } 
} 

Et, le Global. des vêtements d'inscription 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); 

donc, comme je l'ai dit, mon problème est la fonction: "ShouldBeInvoked" n'a jamais appelé.

Une aide?

Répondre

0

Je crois que ce filtre ne serait invoqué que sur les actions décorées avec [Authorize] avez-vous cela sur les méthodes que vous voulez que ce filtre fonctionne?