azure - 在 Service Fabric 集群上发布应用程序后 HttpContext.Session 为空

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

应用程序使用 OAuth2 流 登录用户的 O365 帐户并将返回的访问 token 存储在 session 变量中。以下代码用于存储 token :

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);

以下是我们如何将 token 返回到 Controller 中:

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

我使用了远程调试,并且访问 token 已正确添加,但是一旦我调用 GetSessionValueHttpContext.Session 包含 0 个 key 。

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

最佳答案

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

Service Fabric 可靠 Stateful ServicesActors内置了这样的机制。您可以使用其中之一来缓存您的( protected )访问 token 。 (也可以选择作为 O365 的网关)

关于azure - 在 Service Fabric 集群上发布应用程序后 HttpContext.Session 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40076984/

相关文章:

azure - 从 ZIP 文件中解压缩文件并将其用作 ADF 复制事件中的源

Azure 企业管理员同意动态应用程序范围

session - JSESSIONID 和 hazelcast.sessionId

internet-explorer - Cakephp Session 值未在 IE 浏览器中获取

google-chrome - 为什么 Chrome 不在更改时更新 Typescript 源文件?

browser - 5MB 是 W3C Web Storage 的实际限制吗?

azure - 无法使用 terraform 创建 Azure 认知服务

php - 如何防止 Azure 上的 WordPress 将 URL 中的点更改为下划线?

asp.net - 为什么/何时 session 写入容易受到线程终止的影响?

ruby-on-rails - 在响应中设置 Cache-Control header