1

Я использую Autofac для ввода всех зависимостей моего проекта, который отлично работает. Теперь я добавил атрибут Custom Authorization (мне не нужны очень сложные функции, такие как OWIN и Identity). У пользовательского атрибута авторизации есть зависимость от уровня данных, поэтому я пытаюсь внедрить его как инъекцию свойств. Однако свойство всегда равно Null. Код ниже:Asp.Net Web Api и Autofac с выдачей атрибута пользовательского авторизации (свойство injection)

public class CustomAuthorizationFilterAttribute : AuthorizeAttribute, IAutofacAuthorizationFilter 
{ 
    public IAuthorisationHelper AuthorisationHelper { get; set; } 

    public override void OnAuthorization(HttpActionContext actionContext) 
    { 
     **... removed for brevity** 

      **// TODO: this should be injected by autofac and is always null??** 
      if (AuthorisationHelper.IsValidUser(username, password, out roleOfUser)) 
      { 
       var principal = 
        new GenericPrincipal((new GenericIdentity(username)), 
         (new[] { roleOfUser })); 

       Thread.CurrentPrincipal = principal; 
       return; 
      } 

     ... removed for brevity 

    } 
} 

Код, который впрыскивает AuthorizationHelper:

public static IContainer Container() 
    { 
     var builder = new ContainerBuilder(); 
     var assemblies = new List<Assembly>(); 

     assemblies.Add(Assembly.Load("Kids.Math.Interfaces")); 
     assemblies.Add(Assembly.Load("Kids.Math.Data")); 
     assemblies.Add(Assembly.Load("Kids.Math.Business")); 
     assemblies.Add(Assembly.Load("Kids.Math.ImportExport")); 
     assemblies.Add(Assembly.Load("Kids.Math.Common")); 
     assemblies.Add(Assembly.Load("Kids.Math.Api")); 

     builder.RegisterAssemblyTypes(assemblies.ToArray()). 
      AsImplementedInterfaces(); 

     builder.RegisterType(typeof(MathContext)).As(typeof (DbContext)).InstancePerRequest(); 

     // Register web API controllers. 
     builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

     // TODO: this is not working, also this should be generic to register it for all controllers 
     // inject the authorisation filter 
     builder.RegisterType<AuthorisationHelper>().As<IAuthorisationHelper>(); 
     builder.Register(c => new CustomAuthorizationFilterAttribute()).PropertiesAutowired() 
      .AsWebApiAuthorizationFilterFor<QuestionsImportController>() 
      .InstancePerRequest(); 

     // Set the dependency resolver to be Autofac. 
     var container = builder.Build(); 
     return container; 
    } 

Атрибут зарегистрирован в FilterConfig в filters.Add (новый CustomAuthorizationFilterAttribute());

Все проводки, но AuthorisationHelper всегда равно нулю.

Любые комментарии будут оценены.

ответ

0

Вам не хватает некоторых ключевых шагов регистрации здесь? Обратитесь к Autofac doco

// OPTIONAL: Register the Autofac filter provider. 
    builder.RegisterWebApiFilterProvider(config); 

    // Set the dependency resolver to be Autofac. 
    var container = builder.Build(); 
    config.DependencyResolver = new AutofacWebApiDependencyResolver(container); 

EDIT: После того, как говорят, что конфигурация была настроена правильно, вы пробовали регистрации свой фильтр, как это?

builder.RegisterType<CustomAuthorizationFilterAttribute>().PropertiesAutowired() 
     .AsWebApiAuthorizationFilterFor<QuestionsImportController>() 
     .InstancePerRequest(); 
+0

Я делаю это. Как вы можете видеть, указанная выше функция возвращает контейнер, а затем я использую его как: var container = WebApiAutofacContainer.Container(); config.DependencyResolver = новый AutofacWebApiDependencyResolver (контейнер); .... без этого ничего не сработает !!! Как я уже упоминал, все остальное работает, кроме этой инъекции свойств! – user1829319

+0

Я отредактировал свой ответ. Я не хотел предполагать, что вы делали с контейнером, поэтому я хотел убедиться, что вы правильно его зарегистрировали :) – Ruskin

+0

Привет, Раскин, спасибо вашему ответу. Я попробовал ваше предложение, но все равно не повезло. Недвижимость до сих пор Null. – user1829319