2012-02-02 64 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>();