2016-06-20 5 views
6

Ich bin völlig neu zu OWIN und dieses Problem war ein wichtiger Blocker für mich.HttpContext.Current.Session ist null + OWIN

Grundsätzlich meinem MVC-app habe ich folgende bei Startup-Klasse:

public partial class Startup 
{ 
    public void ConfigureAuth(IAppBuilder app) 
    { 
     app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 
     app.UseCookieAuthentication(new CookieAuthenticationOptions()); 
     app.UseOpenIdConnectAuthentication(
       new OpenIdConnectAuthenticationOptions 
       { 
        ClientId = OfficeSettings.ClientId, 
        Authority = OfficeSettings.Authority, 

        TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters() 
        { 
         RoleClaimType = "roles" 
        }, 

        Notifications = new OpenIdConnectAuthenticationNotifications() 
        { 

        AuthorizationCodeReceived = (context) => 
         { 
         // code hidden for readability 

          if(HttpContext.Current.Session == null) 
          { 
           // It's null. Why is that? 
          } 

          var session = HttpContext.Current.Session; 
          if (session["myMockSession"] != null) 
          { 
           // Do stuff... 
          } 
         }, 

         RedirectToIdentityProvider = (context) => 
         { 
          // code hidden for readability 
         }, 

         AuthenticationFailed = (context) => 
         { 
          // code hidden for readability 
         } 
        } 
       }); 

Ich verstehe nicht, warum, wenn ich das Debuggen, dass die Session null ist. HttpContext.Current Property ist nicht. Gibt es Beschränkungen bei Sessions + OWIN? Gibt es eine Problemumgehung für dieses Problem? Wie sollte man es angehen?

Exkurs 1: Ich habe versucht, dieses Stück Code hinzufügen ich in einer der SO Fragen und die Session war noch null gefunden habe:

app.Use((context, next) => 
      { 
       // Depending on the handler the request gets mapped to, session might not be enabled. Force it on. 
       HttpContextBase httpContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName); 
       httpContext.SetSessionStateBehavior(SessionStateBehavior.Required); 
       return next(); 
      }); 

Exkurs 2: I don Es scheint nicht mehr zu finden, aber jemand schlug in einer der SO Fragen vor, die leeren Methoden Session_Start und Session_End (als leere Methoden) im Global.asax hinzuzufügen. Das hat auch nicht funktioniert.

Ich begrüße alle Hinweise. Danke!

+0

Ich habe ähnliches Problem. Konnten Sie eine Lösung finden? – RonakThakkar

+0

Hallo @RonakThakkar. Leider noch nicht. Ich musste diese Aufgabe beiseite legen, weil ich keine Lösung finden konnte. Vielleicht können wir hoffentlich in diesem Thread eine Lösung finden. – AuroMetal

Antwort

9

Sie sind fast dort. Der Grund dafür, dass Ihre Sitzung noch null ist, besteht darin, dass Sie OWIN nicht angewiesen haben, System.Web-Sitzungen zu initialisieren, bevor Ihre Middleware ausgeführt wird.

Durch das Hinzufügen .UseStageMarker (..)nach Middleware Registrierung Sie OWIN sagen, wo in der Ausführung pipline sollte es SetSessionStateBehaviour führen

app.Use((context, next) => 
{ 
    var httpContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName); 
    httpContext.SetSessionStateBehavior(SessionStateBehavior.Required); 
    return next(); 
}); 

// To make sure the above `Use` is in the correct position: 
app.UseStageMarker(PipelineStage.MapHandler); 

standardmäßig Owin Middleware laufen an das letzte Ereignis (PipelineStage.PreHandlerExecute), das in diesem Fall für Sie zu spät ist.

Nun verwenden Sitzungen, müssen Sie in einer zweiten Middleware arbeiten, die nach läuft die Sitzung durch die Asp.Net Laufzeit erworben wurde. Diese Middleware muss in der PostAquireState Phase ausgeführt werden, etwa so:

.Use((context, next) => 
{ 
    // now use the session 
    HttpContext.Current.Session["test"] = 1; 

    return next(); 
}) 
.UseStageMarker(PipelineStage.PostAcquireState); 

Asp.Net katana docs eine excellent article hat, wie die Middleware funktioniert. Weitere Informationen zur Ausführungsreihenfolge in Asp.net finden Sie in den Dokumenten PiplineStage enum docs und HttpApplication.

+0

Hallo @Johan O, absolut fantastische Erklärung! Vielen Dank für die Details, hoffentlich hilft das ein paar von uns mit dem gleichen Problem. – AuroMetal

Verwandte Themen