【问题标题】:Ninject Custom AuthorizeAttribute Injection isn't workingNinject 自定义 AuthorizeAttribute 注入不起作用
【发布时间】:2012-02-02 15:45:12
【问题描述】:

我碰了壁,希望有人能指出我哪里出错了。

我一直在使用 Ninject 注入自定义 ActionFilterAttributes,这工作正常:

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

我现在正在尝试注入自定义 AuthorizeAttribute。我的语法正确,因此我插入了 Role 和自定义属性:

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

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

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

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

任何帮助将不胜感激

【问题讨论】:

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


    【解决方案1】:

    您应该实现相应的接口,而不是从属性派生,例如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);
    

    【讨论】:

      【解决方案2】:

      我有非常类似于已经提出的问题的问题,但我无法解决。 我正在添加我的自定义授权过滤器,其中可以访问数据库上下文。 dbcontext 被定义为使用 InRequestScope(Ninject Binding)。当我到达过滤器正在执行的位置时,我收到一个错误,表明 dbcontext 已被释放。

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

      授权服务向数据库询问当前用户的权限 - 这意味着 Ninject 应该创建一个新的 dbcontext 实例,但这不会发生...... 我读到“MVC 框架本身缓存过滤器。”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>();
      

      【讨论】:

        猜你喜欢
        • 2020-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-05
        • 1970-01-01
        • 2015-12-06
        • 1970-01-01
        相关资源
        最近更新 更多