2016-06-20 9 views
6

मैं ओविन के लिए बिल्कुल नया हूं और यह मुद्दा मेरे लिए एक प्रमुख अवरोधक रहा है।HttpContext.Current.Session शून्य + ओविन

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

मुझे समझ नहीं आता क्यों जब मैं डिबगिंग रहा है कि सत्र रिक्त है:

असल में, मेरी MVC अनुप्रयोग में मैं स्टार्टअप वर्ग पर निम्न है। HttpContext.Current संपत्ति नहीं है। क्या सत्र + ओविन के साथ कोई बाधा है? क्या इस मुद्दे के लिए कोई कामकाज है? इसे कैसे पहुंचाया जाना चाहिए?

साइड नोट 1: मैं कोड के इस टुकड़े को जोड़ने के लिए कोशिश की है मैं इतना प्रश्नों में से एक में मिल गया है और सत्र अभी भी अशक्त था:

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 SO प्रश्नों में से एक में सुझाव दिया है। उसने न तो काम किया।

मैं किसी भी सलाह का स्वागत कर रहा हूं। धन्यवाद!

+0

मुझे एक ही समस्या है। क्या आप कुछ समाधान ढूंढ पाए थे। – RonakThakkar

+0

हाय @ रोनाकखकर। दुर्भायवश अभी तक नहीं। मुझे यह कार्य एक तरफ रखना पड़ा क्योंकि मुझे कोई समाधान नहीं मिला। शायद उम्मीद है कि हम इस थ्रेड में समाधान प्राप्त कर सकते हैं। – AuroMetal

उत्तर

9

आप लगभग हैं। आपका सत्र अभी भी शून्य है क्योंकि आपने सिस्टम को प्रारंभ करने के लिए ओविन को निर्देश नहीं दिया है। आपके मिडलवेयर से पहले सत्र सत्र को निष्पादित किया जा रहा है।

अपने मिडलवेयर पंजीकरण के बाद .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 कटाना डॉक्स कैसे मिडलवेयर काम करता है पर एक excellent article है। Asp.net में निष्पादन आदेश के विवरण के लिए PiplineStage enum दस्तावेज़ और HttpApplication दस्तावेज़ देखें।

+0

हाय @ जोहान ओ, बिल्कुल शानदार स्पष्टीकरण! विवरण के लिए बहुत बहुत धन्यवाद, उम्मीद है कि हममें से कुछ को एक ही मुद्दे के साथ मदद मिलेगी। – AuroMetal

संबंधित मुद्दे