应用程序使用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
似乎不起作用。
我使用了远程调试,并且正确添加了访问令牌,但在我致电GetSessionValue
后,HttpContext.Session
包含0键。
如果对SF这样的分布式架构使用HttpContext.Session
是一个坏主意,那么什么是一个很好的替代解决方案呢?
答案 0 :(得分:0)
默认情况下,会话数据的范围限定为运行的节点。为了获得高可用性(分布式)解决方案,您需要获取数据并将其复制到其他节点。
Service Fabric Reliable Stateful Services和Actors内置了这样的机制。您可以使用其中一个来缓存您的(受保护的)访问令牌。 (并可选择作为O365的门户)