2016-06-20 16 views
6

Tôi hoàn toàn mới đối với OWIN và vấn đề này đã là một công cụ chặn chính đối với tôi.HttpContext.Current.Session is null + OWIN

Về cơ bản, ít ứng dụng MVC của tôi, tôi có sau tại Startup lớp:

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

Tôi không hiểu tại sao khi tôi gỡ lỗi rằng phiên là null. HttpContext.Current Property không phải là. Có bất kỳ ràng buộc nào với Phiên + OWIN không? Có cách giải quyết nào cho vấn đề này không? Làm thế nào nên tiếp cận nó?

Side lưu ý 1: Tôi đã cố gắng thêm đoạn mã này tôi đã tìm thấy trong một trong những câu hỏi SO và phiên vẫn còn null:

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 lưu ý 2: tôi don dường như không tìm thấy nó nữa, nhưng ai đó đã đề xuất trong một trong các câu hỏi SO để thêm các phương thức trống Session_Start và Session_End (như các phương thức trống) tại Global.asax. Điều đó không hiệu quả.

Tôi đang chào đón mọi lời khuyên. Cảm ơn!

+0

Tôi có vấn đề tương tự. bạn có thể tìm thấy một số giải pháp. – RonakThakkar

+0

Xin chào @RonakThakkar. Không may rằng chưa xong. Tôi phải bỏ công việc này sang một bên vì tôi không thể tìm ra giải pháp nào. Có lẽ chúng tôi có thể nhận được một giải pháp trong chủ đề này, hy vọng. – AuroMetal

Trả lời

9

Bạn đang gần như ở đó. Lý do phiên của bạn vẫn là null là bạn đã không hướng dẫn OWIN khởi tạo System.Web Phiên trước khi phần mềm trung gian của bạn được thực thi.

Bằng cách thêm .UseStageMarker (..)sau đăng ký middleware của bạn, bạn sẽ nói với OWIN nơi trong pipline thực hiện nó nên thực hiện 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); 

Theo mặc định, Owin Middleware chạy ở sự kiện cuối cùng (PipelineStage.PreHandlerExecute) đã quá muộn cho bạn trong trường hợp này.

Bây giờ, sử dụng phiên, bạn cần phải làm việc trong một giây middleware , chạy sau phiên đã được mua lại bởi thời gian chạy Asp.Net. middleware này phải được chạy trong giai đoạn PostAquireState, như vậy:

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

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

docs Asp.Net katana có excellent article về cách middleware hoạt động. Xem tài liệu enum PiplineStage và tài liệu HttpApplication để biết chi tiết về trình tự thực hiện trong Asp.net.

+0

Xin chào @ Johan O, lời giải thích tuyệt vời tuyệt vời! Cảm ơn bạn rất nhiều vì các chi tiết, hy vọng rằng sẽ giúp một vài người trong chúng ta với cùng một vấn đề. – AuroMetal

Các vấn đề liên quan