2014-07-09 15 views
15

Sto provando a impostare la mia dipendenza da iniezione e ho bisogno di iniettare un IAuthenticationManager dall'identità ASP.NET a OwinContext.Come ottenere OwinContext da Global.asax?

Per questo sono dalla mia Global.asax -> ServiceConfig.Configure() esecuzione:

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

Ma quando sto facendo funzionare la mia domanda ottengo questo messaggio:

voce

Nessun owin.Environment è stato trovato nel contesto

Perché questo HttpContext.Current.GetOwinContext() non è disponibile da 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

guarda [questa risposta] (http://stackoverflow.com/questions/20168978/do-i-need-a-global-asax-cs-file-at-all -se-im-con-un-Owin-startup-cs-classe-e). Principalmente, Global.asax viene chiamato prima di Startup.cs – Jonesopolis

+0

Hm, ho "Microsoft.Owin.Host.SystemWeb.dll" nella mia directory. Ho provato a spostare tutto su Startup.cs dal mio Global.asax dopo che ho fatto ConfigureAuth (...) lo stesso messaggio viene comunque. – janhartmann

+0

Ho appena provato a creare un'app completamente nuova e ho provato a ottenere OwinContext con gli stessi risultati. Ci deve essere un modo :-) – janhartmann

risposta

10

I fissati con il seguente:

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

}); 

Sembra l'OwnContext non è presente a sta rtup, quindi lo aspetterò e lo inietterò una volta presente. Si prega di notare che lo container.IsVerifying() è presente in SimpleInjector.Advanced

+0

Che cos'è questo "RegisterPerWebRequest()"? da dove lo prendi? L'unità non sembra avere un tale metodo o estensione. – Marty

+0

Trovato. Stai usando SimpleInjector. ok. La domanda è come si registra il tipo. Ad esempio, il controller necessita di un repository, che necessita di IauthManager. – Marty

+0

Qualcuno sa come farlo con Castle Windsor? – mayabelle

Problemi correlati