Ninject Custom AuthorizeAttribute Injection无效

时间:2012-02-02 15:45:12

标签: asp.net-mvc-3 filter ninject authorize-attribute

我碰到了一堵墙,希望有人能指出我出错的地方。

我一直在使用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);

该属性正在正确执行,角色和年份正在插入正常,我的问题是我尝试注入的服务始终为null:

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

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

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:3)

您应该实现相应的界面,而不是从属性派生,例如IAuthorizationFilterIActionFilter并使用不同的常规属性来标记要应用该过滤器的控制器或操作

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

答案 1 :(得分:0)

我的问题类似于已经问过的问题,但我无法解决。 我正在添加我的自定义授权过滤器,它们可以访问db上下文。 dbcontext定义为使用InRequestScope(Ninject Binding)。当我点击过滤器正在执行的点时,我收到一个错误,即dbcontext已经被处理掉了。

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

aurhorization服务要求db获取当前用户的权限 - 这意味着Ninject应该创建一个新的dbcontext实例,但是这个dosn不会发生...... 我读过&#34; MVC框架本身缓存了过滤器。 &#34; 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>();