2016-06-20 3 views
6

Я совершенно новый для OWIN, и эта проблема была для меня главным блокиратором.HttpContext.Current.Session is null + OWIN

В принципе, в моем приложении MVC У меня есть следующие в классе запуска:

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

Я не понимаю, почему, когда я отладки, что сессия является недействительным. Свойство HttpContext.Current - нет. Существуют ли ограничения с Session + OWIN? Есть ли способ обхода проблемы? Как к нему подойти?

Примечание стороны 1: Я пытался добавить этот кусок кода, который я нашел в одном из SO вопросов и сессия была еще нулевой:

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

Примечание стороны 2: Я надеваю Кажется, он больше не находит его, но кто-то предложил в одном из вопросов SO добавить пустые методы Session_Start и Session_End (как пустые методы) в Global.asax. Это тоже не сработало.

Я приветствую любые советы. Спасибо!

+0

У меня есть аналогичный выпуск. вы могли найти какое-то решение. – RonakThakkar

+0

Привет @RonakThakkar. К сожалению, пока нет. Мне пришлось отложить эту задачу, потому что я не мог найти решения. Возможно, мы сможем найти решение в этой теме. – AuroMetal

ответ

9

Вы почти есть. Причина, по которой ваша сессия по-прежнему равна нулю, заключается в том, что вы не проинструктировали OWIN инициализировать сеансы System.Web до того, как ваше промежуточное программное обеспечение будет выполнено.

Добавляя .UseStageMarker (..)после вашей регистрации промежуточного слоя вы расскажете Owin, где в исполнении pipline она должна выполнять 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); 

По умолчанию Owin Middleware работать на последнее событие (PipelineStage.PreHandlerExecute), которое слишком поздно для вас в этом случае.

Теперь, чтобы использовать сессии, вы должны работать в второго промежуточного слоя, который работает после сессия была Приобрели исполняющую Asp.Net. Это промежуточное ПО должны работать в фазе PostAquireState, например, так:

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

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

Asp.Net катана Docs имеет excellent article о том, как работает промежуточное программное обеспечение. См. Документацию enum docs и документы HttpApplication для получения информации о порядке выполнения в Asp.net.

+0

Hi @Johan O, абсолютно фантастическое объяснение! Большое спасибо за детали, надеюсь, это поможет некоторым из нас с той же проблемой. – AuroMetal

Смежные вопросы