Azure HttpContext。应用程序在服务结构群集上发布后会话为空

Azure HttpContext。应用程序在服务结构群集上发布后会话为空,azure,session,caching,asp.net-core,azure-service-fabric,Azure,Session,Caching,Asp.net Core,Azure Service Fabric,应用程序使用OAuth2 flow登录用户的O365帐户,并将返回的访问令牌存储在会话变量中。以下代码用于存储令牌: var authResult = await authContext.AcquireTokenByAuthorizationCodeAsync( Request.Query["code"], loginRedirectUri,

应用程序使用
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);
}
此解决方案适用于本地5节点群集,但一旦发布在Azure 3节点群集上,
会话
似乎就不起作用了

我使用了远程调试并正确添加了访问令牌,但一旦调用
GetSessionValue
HttpContext.Session
包含0键


如果使用
HttpContext.Session
对于SF这样的分布式体系结构来说是个坏主意,那么什么是一个好的替代解决方案呢?

默认情况下,会话数据的作用域是它所运行的节点。为了获得高可用性(分布式)解决方案,您需要获取数据并将其复制到其他节点

服务结构是可靠的,并且内置了这样的机制。您可以使用其中一个来缓存(受保护的)访问令牌。(并可选择用作O365的网关)