Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get OwinContext from Global.asax?

I am trying to set up my Dependency Injection and I am in the need of injecting a IAuthenticationManager from ASP.NET Identity to an OwinContext.

For this I am from my Global.asax -> ServiceConfig.Configure() running:

 container.Register(() => HttpContext.Current.GetOwinContext().Authentication);

But when I am running my application I get this message:

No owin.Environment item was found in the context

Why is this HttpContext.Current.GetOwinContext() not available from Global.asax?

Startup.cs

[assembly: OwinStartupAttribute(typeof(MyApp.Web.Startup))]
namespace Speedop.Web
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
        }
    }
}

Startup.Auth.cs

public partial class Startup
{
    public void ConfigureAuth(IAppBuilder app)
    {
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            Provider = new CookieAuthenticationProvider
            {
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<UserManager<User, int>, User, int>(
                    validateInterval: TimeSpan.FromMinutes(30),
                    regenerateIdentityCallback: (manager, user) => manager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie),
                    getUserIdCallback: (id) => (Int32.Parse(id.GetUserId()))
                    )
            }
        });

        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
    }
}
like image 478
janhartmann Avatar asked Jul 09 '14 17:07

janhartmann


1 Answers

I fixed this with the following:

container.RegisterPerWebRequest(() =>
{
    if (HttpContext.Current != null && HttpContext.Current.Items["owin.Environment"] == null && container.IsVerifying())
    {
        return new OwinContext().Authentication;
    }
    return HttpContext.Current.GetOwinContext().Authentication;

});

Seems like the OwnContext is not present at startup, so I'll wait for it and inject it once its present. Please note that the container.IsVerifying() is present in SimpleInjector.Advanced

like image 142
janhartmann Avatar answered Oct 13 '22 18:10

janhartmann