2016-06-20 24 views
6

Jestem całkowicie nowym użytkownikiem OWIN i ten problem był dla mnie poważnym blokerem.HttpContext.Current.Session ma wartość null + OWIN

Zasadniczo, w mojej aplikacji MVC mam następujące klasy w Startup:

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

Nie rozumiem dlaczego kiedy jestem debugowania, że ​​sesja jest null. Właściwość HttpContext.Current nie jest. Czy są jakieś ograniczenia dotyczące Sesji + OWIN? Czy istnieje jakieś obejście tego problemu? Jak do niego podejść?

marginesie 1: Próbowałem dodać ten kawałek kodu znalazłem w jednym z SO pytania i sesja była nadal zerowy:

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

uwaga Side 2: I don Wydaje się, że to już nie jest, ale ktoś zasugerował w jednym z pytań SO, aby dodać puste metody Session_Start i Session_End (jako puste metody) w Global.asax. To nie zadziałało ani.

Witam każdą radę. Dzięki!

+0

Mam podobny problem. czy byłeś w stanie znaleźć jakieś rozwiązanie. – RonakThakkar

+0

Witam @RonakThakkar. Niestety jeszcze nie. Musiałem odłożyć to zadanie na bok, ponieważ nie mogłem znaleźć żadnego rozwiązania. Być może uda nam się uzyskać rozwiązanie tego wątku. – AuroMetal

Odpowiedz

9

Jesteś tam prawie. Powodem, dla którego twoja sesja jest nadal pusta, jest to, że nie zleciłeś OWIN inicjalizacji Sesji System.Web przed uruchomieniem oprogramowania pośredniego.

Dodając .UseStageMarker (..)po rejestracji middleware powiesz OWIN gdzie w PipLine wykonania powinno wykonywać 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); 

Domyślnie Owin Middleware prowadzony na ostatnie zdarzenie (PipelineStage.PreHandlerExecute), które w tym przypadku jest za późno.

Teraz używać sesje, trzeba pracować w drugim middleware, która biegnie po sesja zostało nabyte przez program ASP.NET. Niniejsza middleware musi być prowadzony w PostAquireState fazie tak:

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

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

Asp.Net katana docs ma excellent article w jaki sposób działa middleware. Zobacz enum docs PiplineStage i dokumentację HttpApplication, aby uzyskać szczegółowe informacje na temat kolejności wykonywania w Asp.net.

+0

Witam @Johan O, absolutnie fantastyczne wyjaśnienie! Dziękuję bardzo za szczegóły, mam nadzieję, że pomoże to kilku z nas z tym samym problemem. – AuroMetal