2012-02-02 60 views
2

我打了一下墙,希望有人能指出我要去哪里错了。Ninject自定义AuthorizeAttribute注入不起作用

我一直在使用Ninject注入到定制ActionFilterAttributes,这是工作的罚款:

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

我现在试图注入定制AuthorizeAttribute。我有语法正确的,这样我将角色和自定义属性:

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

被正确执行的属性和角色,并多年来被插入细,我的问题是,服务我m试图注入始终为空:

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

在正常的ActionFilterAttributes服务注入罚款,但在这里它不是。

任何帮助,反而会从您应该实现的属性获得的理解

回答

3

相应的接口如IAuthorizationFilterIActionFilter并使用不同的正常attribut纪念控制器或动作,而您要应用过滤器

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

我已经非常发出类似于已经被问到的问题,但我解决不了。 我正在添加我的自定义授权过滤器,它们可以访问数据库上下文。 dbcontext被定义为使用InRequestScope(Ninject Binding)。当我碰到过滤器正在执行的地方时,我得到一个错误,说明dbcontext已经被处置了。

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

的aurhorization服务要求分贝为当前用户的权限 - 这意味着Ninject应该创建一个新的DbContext实例,但这不到风度发生... 我读了“的MVC框架itsself缓存过滤器“。https://github.com/ninject/Ninject.Web.Mvc/wiki/Filters-and-Scoped

但无法得到如何实现我的过滤器绑定。

目前,这些是我的绑定:

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>(); 
相关问题