【问题标题】:HttpContext.Session empty after app is published on Service Fabric cluster在 Service Fabric 群集上发布应用后,HttpContext.Session 为空
【发布时间】:2017-02-25 21:10:26
【问题描述】:

应用程序使用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 节点集群上发布后,Session 似乎不起作用。

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

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

【问题讨论】:

    标签: azure session caching asp.net-core azure-service-fabric


    【解决方案1】:

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

    Service Fabric Reliable Stateful ServicesActors 内置了此类机制。您可以使用其中一种机制来缓存(受保护的)访问令牌。 (并且可以选择作为通向 O365 的网关)

    【讨论】:

      猜你喜欢
      • 2017-04-07
      • 2017-08-09
      • 2016-12-06
      • 2018-07-11
      • 2017-01-30
      • 2019-06-05
      • 2016-03-25
      • 2017-07-31
      • 1970-01-01
      相关资源
      最近更新 更多