2016-06-20 27 views
6

私はOWINにとって全く新しく、この問題は私にとって大きな妨げになっています。私はセッションがnullであることをデバッグしていたときに、なぜHttpContext.Current.Session is null + OWIN

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プロパティはそうではありません。 Sessions + OWINに制約がありますか?この問題の回避策はありますか?どのようにそれにアプローチすべきですか?

注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: Iドン私はSOの質問のいずれかに見つけたとセッションはまだヌルいたコードのこの部分を追加しようとしました もう見つからないようですが、誰かがSOの質問の1つで、空のメソッドSession_StartとSession_End(空のメソッドとして)をGlobal.asaxに追加するように提案しました。それはどちらもうまくいきませんでした。

私はアドバイスを歓迎しています。 ありがとう!

+0

私も同様の問題があります。あなたはいくつかの解決策を見つけることができましたか? – RonakThakkar

+0

こんにちは@RonakThakkar。残念ながら、まだです。私は何の解決策も見つけられなかったので、この仕事を脇に置かなければなりませんでした。うまくいけば、このスレッドで解決策が得られるかもしれません。 – AuroMetal

答えて

9

あなたはです。があります。 セッションがまだヌルである理由は、ミドルウェアが実行される前にSystem.Webセッションを初期化するようにOWINに指示していないからです。ミドルウェアの登録後.UseStageMarker(..)を追加することにより

実行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を教えてあげましょう、Owinミドルウェアで実行しますこの場合は最後のイベント(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 docsとHttpApplicationドキュメントを参照してください。

+0

こんにちは@ヨハンO、絶対に素晴らしい説明!詳細をありがとう、うまくいけば、同じ問題で私たちのいくつかを助けるでしょう。 – AuroMetal