2

我遇到了一些障碍,希望有人能指出我哪里出错了。

我一直在使用 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 中,服务被很好地注入,但这里不是。

任何帮助,将不胜感激

4

2 回答 2

3

而不是从属性派生,您应该实现相应的接口,例如IAuthorizationFilter,或者IActionFilter使用不同的普通属性来标记您想要应用该过滤器的控制器或操作

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);
于 2012-02-02T22:43:44.697 回答
0

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

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

aurhorization 服务向数据库询问当前用户的权限 - 这意味着 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>();
于 2015-04-30T14:15:35.900 回答