2016-10-17 4 views
4

に公開された後、HttpContext.Sessionが空になります。アプリケーションはOAuth2 flowを使用して、ユーザーのO365アカウントにログインし、返されたアクセストークンをセッション変数に格納します。次のコードは、トークンを格納するために使用されます。アプリケーションがサービスファブリッククラスタ

var authResult = await authContext.AcquireTokenByAuthorizationCodeAsync(
    Request.Query["code"],           
    loginRedirectUri,            
    new ClientCredential(ConfigSettings.ClientId, ConfigSettings.ClientSecret), 
    ConfigSettings.O365UnifiedAPIResource); 

var authResultEWS = await authContext.AcquireTokenByAuthorizationCodeAsync(
    Request.Query["code"],           
    loginRedirectUri,            
    new ClientCredential(ConfigSettings.ClientId, ConfigSettings.ClientSecret), 
    ConfigSettings.EWSAPIResource); 

HttpContext.Session.SetString(SessionKeys.Login.AccessToken, authResult.AccessToken); 
HttpContext.Session.SetString(SessionKeys.Login.EWSAccessToken, authResultEWS.AccessToken); 

そしてここでは、我々のコントローラにトークンを取り戻す方法です:

private string GetSessionValue(string key) 
{ 
    byte[] buffer = new byte[2048]; 
    HttpContext.Session.TryGetValue(key, out buffer); 
    return System.Text.Encoding.UTF8.GetString(buffer); 
} 

このsolutonは地元の5つのノードのクラスタ上で動作しますが、一度に公表しますAzure 3ノードクラスタの場合、Sessionは機能していないようです。

私はリモートデバッグを使用しましたが、アクセストークンは正しく追加されましたが、GetSessionValueと呼ばれるとHttpContext.Sessionに0キーが含まれています。

HttpContext.Sessionを使用する場合、SFなどの分散アーキテクチャにとっては悪い考えですが、どのような代替ソリューションが適していますか?

答えて

0

デフォルトでは、セッションデータは実行されているノードにスコープされます。高可用性(分散型)ソリューションを利用するには、データを取得してそれを他のノードに複製する必要があります。

サービスファブリック信頼性Stateful ServicesおよびActorsには、そのようなメカニズムが組み込まれています。これらのいずれかを使用して、(保護された)アクセストークンをキャッシュすることができます。 (また、オプションでO365へのゲートウェイとして機能する)

関連する問題