2016-06-20 68 views
6

Sono completamente nuovo per OWIN e questo problema è stato un grosso ostacolo per me.HttpContext.Current.Session è null + OWIN

In sostanza, il mio MVC app Ho il seguente in classe di avvio:

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 
         } 
        } 
       }); 

Non capisco perché quando sto debug che la sessione è nullo. La proprietà HttpContext.Current non lo è. Ci sono dei vincoli con Sessions + OWIN? C'è qualche soluzione per questo problema? Come ci si dovrebbe avvicinare?

Side Nota 1: ho cercato di aggiungere questo pezzo di codice che ho trovato in uno dei SO domande e la sessione è stata ancora nulla:

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(); 
      }); 

Side nota 2: I don Sembra che lo trovi più, ma qualcuno ha suggerito in una delle domande SO di aggiungere metodi vuoti Session_Start e Session_End (come metodi vuoti) a Global.asax. Questo non ha funzionato neanche.

Sto dando il benvenuto a qualsiasi consiglio. Grazie!

+0

Ho un problema simile. sei riuscito a trovare qualche soluzione. – RonakThakkar

+0

Ciao @RonakThakkar. Sfortunatamente, non ancora. Ho dovuto mettere da parte questo compito perché non riuscivo a trovare alcuna soluzione. Forse potremmo ottenere una soluzione in questo thread, si spera. – AuroMetal

risposta

9

Sei quasi lì. Il motivo per cui la sessione è ancora nullo è che non hai istruito OWIN per inizializzare le sessioni System.Web prima che il tuo middleware venga eseguito.

Aggiungendo .UseStageMarker (..)dopo la registrazione middleware dirai OWIN dove nel pipline l'esecuzione, deve eseguire SetSessionStateBehaviour

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); 

Per impostazione predefinita, Owin Middleware funzionare a l'ultimo evento (PipelineStage.PreHandlerExecute) che è troppo tardi per te in questo caso.

Ora, per usare le sessioni, è necessario lavorare in un secondo middleware , che viene eseguito dopo la sessione è stata acquisita dal runtime Asp.Net. Questo middleware deve essere eseguito in PostAquireState fase, in questo modo:

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

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

docs Asp.Net katana ha un excellent article su come funziona il middleware. Vedere i documenti enum PiplineStage e i documenti HttpApplication per i dettagli sull'ordine di esecuzione in Asp.net.

+0

Ciao @Johan O, spiegazione assolutamente fantastica! Grazie mille per i dettagli, speriamo che possa aiutare alcuni di noi con lo stesso problema. – AuroMetal