Ninject Custom AuthorizeAttribute Injection не работает - PullRequest
2 голосов
/ 02 февраля 2012

Я немного ударился о стену и надеялся, что кто-то может указать, где я иду не так.

Я использовал 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);

Атрибут выполняется правильно, а роли и годы вставляются нормально, моя проблема в том, что служба, в которую я пытаюсь внедрить, всегда равна нулю:

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

В обычных ActionFilterAttributes служба добавляется нормально, но здесь это не так.

Буду признателен за любую помощь

Ответы [ 2 ]

3 голосов
/ 03 февраля 2012

Вместо того, чтобы наследовать от атрибута, вы должны реализовать соответствующий интерфейс, например, 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);
0 голосов
/ 30 апреля 2015

У меня очень похожая проблема на уже заданный вопрос, но я не могу ее решить. Я добавляю свои пользовательские фильтры авторизации, которые внутри имеют доступ к контексту БД. 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>();
...