2012-02-02 2 views
2

J'ai frappé un peu au mur et j'espérais que quelqu'un pourrait indiquer où je me trompe.Ninject Custom AuthorizeAttribute Injection ne fonctionne pas

Je l'ai utilisé Ninject à Injecter dans ActionFilterAttributes personnalisés et cela fonctionne très bien:

kernel.BindFilter<CriticalErrorAttribute>(FilterScope.Last, 1); 

Je suis maintenant essayer d'injecter dans une coutume AuthorizeAttribute. J'ai la syntaxe correcte afin que j'insérer le rôle et les attributs personnalisés:

kernel.BindFilter<Authorisation>(FilterScope.Action, 0) 
.WhenActionMethodHas<Authorisation>() 
.WithPropertyValueFromActionAttribute<Authorisation>("Roles", n => n.Roles) 
.WithPropertyValueFromActionAttribute<Authorisation>("Years", n => n.Years); 

L'attribut est en cours d'exécution correctement et que les rôles et les années sont en cours d'insertion bien, mon problème est qu'un service je m essayant d'injecter est toujours nulle:

[Inject] 
public IUserServices userService { get; set; } 

en ActionFilterAttributes normal, le service est injecté très bien, mais ici il n'est pas.

Toute aide serait appréciée

Répondre

3

Au lieu de tirer d'un attribut que vous devez implémenter l'interface correspondante par exemple IAuthorizationFilter ou IActionFilter et utiliser un autre attribut normale pour marquer les contrôleurs ou les actions que vous souhaitez appliquer ce filtre

public class AuthorisationFilter : IAuthorizationFilter .... 
public class Authorization : Attribute .... 

kernel.BindFilter<AuthorisationFilter>(FilterScope.Action, 0) 
     .WhenActionMethodHas<Authorisation>() 
     .WithPropertyValueFromActionAttribute<Authorisation>("Roles", n => n.Roles) 
     .WithPropertyValueFromActionAttribute<Authorisation>("Years", n => n.Years); 
0

Je délivre très similaire à la question déjà posée, mais je ne peux pas le résoudre. J'ajoute mes filtres d'autorisation personnalisés, qui ont accès au contexte db. Le dbcontext est défini pour être utilisé dans InRequestScope (liaison de Ninject). Lorsque j'atteins le point où le filtre est en cours d'exécution, j'obtiens une erreur que dbcontext a déjà été éliminé.

void IAuthorizationFilter.OnAuthorization(AuthorizationContext filterContext) 
{ 
.... 
var customerPermissions = _authorizationService.GetCustomersListForPermission(_userProvider.CurrentUser.Username, 
       this.PermissionEnums); 
.. 
} 

Le service aurhorization demande au db des autorisations pour l'utilisateur actuel - cela signifie que Ninject devrait créer une nouvelle instance dbcontext, mais ce dosn't arriver ... je lis que « Le framework MVC itsself met en cache filtres. "https://github.com/ninject/Ninject.Web.Mvc/wiki/Filters-and-Scoped

Mais ne peut pas obtenir comment implémenter mes liaisons de filtre.

Actuellement ce sont les liaisons que j'ai:

kernel.Bind<TDBContext>().ToSelf().InRequestScope(); 
    kernel.Bind<IUnitOfWork>().To<UnitOfWork>();//.InThreadScope(); 

      kernel.Bind<IUnitOfWorkManager>().To<UnitOfWorkManager>().InRequestScope(); 

    #region UserAllCSPermissionBasedAuthFilter 
      kernel.BindFilter<UserAllCSPermissionBasedAuthFilter>(FilterScope.Action, 0) 
       .WhenActionMethodHas<UserAllCSPermissionBasedAuthFilter>() 
       .WithConstructorArgumentFromActionAttribute<UserAllCSPermissionBasedAuthFilter>("permissionEnums", att => att.PermissionEnums); 

      kernel.BindFilter<UserAllCSPermissionBasedAuthFilter>(FilterScope.Controller, 0) 
       .WhenActionMethodHas<UserAllCSPermissionBasedAuthFilter>() 
       .WithConstructorArgumentFromControllerAttribute<UserAllCSPermissionBasedAuthFilter>("permissionEnums", att => att.PermissionEnums); 
      #endregion 




    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
    public class UserAllCSPermissionBasedAuthFilter : FilterAttribute, IAuthorizationFilter 
    { 
     #region Private Fields 
     private static readonly ObjectCache _permissionCache = MemoryCache.Default; 
     private static readonly ILog _log = LogManager.GetLogger(typeof(UserAllCSPermissionBasedAuthFilter)); 

     [Inject] 
     public IAuthorizationService _authorizationService { get; set; }/// DependencyResolver.Current.GetService<IAuthorizationService>(); 
Questions connexes