2016-10-17 45 views
4

应用程序使用OAuth2 flow登录用户的O365帐户并将返回的访问令牌存储在会话变量中。下面的代码是用来保存标记:在服务结构集群上发布应用程序后HttpContext.Session为空

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似乎不起作用。

我用远程调试和访问令牌被正确添加,但是一旦我呼叫GetSessionValueHttpContext.Session包含0密钥。

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

回答

0

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

服务结构可靠Stateful ServicesActors内置此类机制。您可以使用其中一种缓存您的(受保护的)访问令牌。 (并且可选地作为通向O365的网关)

相关问题