У меня есть настройка конфигурации для Simple Injector, где я переместил все мои записи в конвейер OWIN.
Теперь проблема в том, что у меня есть контроллер AccountController
, который фактически принимает параметры как
public AccountController(
AngularAppUserManager userManager,
AngularAppSignInManager signinManager,
IAuthenticationManager authenticationManager)
{
this._userManager = userManager;
this._signInManager = signinManager;
this._authenticationManager = authenticationManager;
}
Теперь мои конфигурации Owin Pipeline выглядят примерно так:
public void Configure(IAppBuilder app)
{
_container = new Container();
ConfigureOwinSecurity(app);
ConfigureWebApi(app);
ConfigureSimpleinjector(_container);
app.Use(async (context, next) =>
{
_container.Register<IOwinContext>(() => context);
await next();
});
_container.Register<IAuthenticationManager>(
() => _container.GetInstance<IOwinContext>().Authentication);
_container.Register<SignInManager<Users, Guid>, AngularAppSignInManager>();
}
private static void ConfigureOwinSecurity(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
CookieName = "AppNgCookie",
//LoginPath = new PathString("/Account/Login")
});
}
private static void ConfigureWebApi(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();
WebApiConfig.Register(config);
app.UseWebApi(config);
}
private static void ConfigureSimpleinjector(Container container)
{
SimpleInjectorInitializer.Initialize(container);
}
И простой инициализатор инжектора выглядит примерно так:
private static void InitializeContainer(Container container)
{
container.Register<DbContext, AngularAppContext>();
container.Register<IUserStore<Users, Guid>, AngularAppUserStore>();
container.Register<IRoleStore<Roles, Guid>, AngularAppRoleStore>();
container.Register<UserManager<Users, Guid>, AngularAppUserManager>();
container.Register<RoleManager<Roles, Guid>, AngularAppRoleManager>();
//container.RegisterPerWebRequest<SignInManager<Users, Guid>, AngularAppSignInManager>();
container.Register<IdentityFactoryOptions<AngularAppUserManager>, IdentityFactoryOptions<AngularAppUserManager>>();
//container.Register<IAuthenticationManager>(() => HttpContext.Current.GetOwinContext().Authentication);
//container.Register<SignInManager<Users, Guid>, AngularAppSignInManager>();
// For instance:
// container.Register<IUserRepository, SqlUserRepository>();
}
Теперь проблема в том, что контроллер не может зарегистрировать IAuthenticationManager
. Я попытался использовать
container.Register<IAuthenticationManager>(
() => HttpContext.Current.GetOwinContext().Authentication);
Но это оставляет меня с Исключением как:
System.InvalidOperationException: нет owin.Environment элемент был найден в контексте.
В этой строке
container.Register<IAuthenticationManager>(
() => HttpContext.Current.GetOwinContext().Authentication);
Я также попытался вместо HttpContext.Current.GetOwinContext().Authentication
использовать HttpContext.Current.GetOwinContext().Authentication
с указанной выше конфигурацией в методе public void Configure(app)
для регистрации с помощью app.Use()
. И затем позже разрешите его через контейнер, чтобы получить IAuthenticationManager
. Но все возможности оставили меня неудачным.
Что мне здесь не хватает? Почему HttpContext.Current.GetOwinContext().Authentcation
не удается разрешить аутентификацию из OwinContext?
И если это не так, почему же такая же конфигурация через app.Use
тоже не работает?