2016-10-21 4 views
2

Я настроил AutoFac для работы с идентификатором ASP.NET в MVC 5. Все казалось, что оно отлично работает на поверхности, то есть пользователи могут создавать учетные записи и вести журнал но затем я обнаружил, что пользователи не выходят из системы, когда был изменен Security Stamp. Либо путем грубой силы в таблице AspNetUsers, либо пользователями, изменяющими пароль и ожидающими выхода из системы в другом браузере.Autofac с идентификатором ASP.NET в MVC 5 не проверяет штамп безопасности в конвейере OWIN

Вот как я установил AutoFac, следуя this unofficial article.

public void Configuration(IAppBuilder app) 
{ 
    var builder = new ContainerBuilder(); 

    builder.RegisterType<ApplicationDbContext>().AsSelf().InstancePerRequest(); 
    builder.RegisterType<ApplicationUserStore>().As<IUserStore<ApplicationUser>>().InstancePerRequest(); 
    builder.RegisterType<ApplicationUserManager>().AsSelf().InstancePerRequest(); 
    builder.RegisterType<ApplicationSignInManager>().AsSelf().InstancePerRequest(); 
    builder.Register<IAuthenticationManager>(c => HttpContext.Current.GetOwinContext().Authentication).InstancePerRequest(); 
    builder.Register<IDataProtectionProvider>(c => app.GetDataProtectionProvider()).InstancePerRequest(); 

    builder.RegisterControllers(typeof(MvcApplication).Assembly); 

    var container = builder.Build(); 

    DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

    app.UseAutofacMiddleware(container); 
    app.UseAutofacMvc(); 

    ConfigureAuth(app); 
} 

Вот как я установил промежуточное программное обеспечение для аутентификации cookie. Он по умолчанию, за исключением , проверяет интервал на короткий промежуток времени.

public void ConfigureAuth(IAppBuilder app) 
{ 
    app.UseCookieAuthentication(new CookieAuthenticationOptions 
    { 
     AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
     LoginPath = new PathString("/Account/Login"), 
     Provider = new CookieAuthenticationProvider 
     { 
      OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
       validateInterval: TimeSpan.FromSeconds(15), 
       regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
     } 
    });    
} 

Если установить точку останова в GenerateUserIdentityAsync то он вызывается только тогда, когда пользователь входит в систему в первый раз.

ответ

3

Валидатор безопасности печати нуждается в ApplicationUserManager, и он пытается разрешить экземпляр из контекста OWIN (потому что он не знает ничего лучшего). Поэтому вам все равно необходимо зарегистрировать ApplicationUsreManager с OWIN:

app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationUserManager>()); 

 Смежные вопросы

  • Нет связанных вопросов^_^