2014-07-09 4 views
15

Ich versuche, meine Dependency Injection einzurichten, und ich brauche eine IAuthenticationManager von ASP.NET Identity zu einem OwinContext.Wie bekomme ich OwinContext von Global.asax?

dieses Denn ich von meinem Global.asax -> ServiceConfig.Configure() Laufen bin:

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

Aber wenn ich meine Anwendung laufen lasse bekomme ich diese Meldung:

Artikel Nr owin.Environment im Kontext gefunden wurde

Warum ist diese HttpContext.Current.GetOwinContext() nicht verfügbar von 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); 
    } 
} 
+0

finden Sie unter [diese Antwort] (http://stackoverflow.com/questions/20168978/do-i-need-a-global-asax-cs-file-at-all -if-im-using-ein-owin-startup-cs-class-und). Hauptsächlich wird Global.asax vor Startup.cs aufgerufen. – Jonesopolis

+0

Hm, ich habe 'Microsoft.Owin.Host.SystemWeb.dll' in meinem Verzeichnis. Ich habe versucht, alles von meinem Global.asax auf Startup.cs zu verschieben, nachdem ich ConfigureAuth (...) noch die gleiche Nachricht kam. – janhartmann

+0

Ich habe gerade versucht, eine ganz neue Beispiel-App zu erstellen und habe versucht, den OwinContext mit denselben Ergebnissen zu erhalten. Es muss einen Weg geben :-) – janhartmann

Antwort

10

Ich reparierte diese mit den folgenden:

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

}); 

scheint, wie die OwnContext nicht ist anwesend bei sta rtup, also werde ich darauf warten und es injizieren, sobald es vorhanden ist. Bitte beachten Sie, dass die container.IsVerifying() ist in SimpleInjector.Advanced

+0

Was ist das "RegisterPerWebRequest()"? Woher bekommst du es? Einheit scheint keine solche Methode oder Erweiterung zu haben – Marty

+0

Gefunden. Sie verwenden SimpleInjector. OK. Frage ist, wie Sie den Typ registrieren. Zum Beispiel benötigt der Controller einen Repo, der den IauthManager benötigt. – Marty

+0

Kann jemand das mit Castle Windsor machen? – mayabelle

Verwandte Themen