2020 年 11 月更新
这个答案最初是为 MSAL 客户端的 V2 编写的。从那时起,已经发布了一个 V3,它的工作方式可能与 V2 不同。
原答案
我不清楚它是否会始终检查当前 AccessToken 的过期时间并在方法调用时自动刷新它(使用 RefreshToken)。
如果我正确理解this answer,则在提供offline_access 范围时会自动提供刷新令牌
...您已请求offline_access 范围,因此您的应用会收到刷新令牌。
AcquireTokenSilentAsync 的 description 表示当提供刷新令牌时,它将检查令牌上的到期日期,如果它已过期或即将到期,则获取一个新的。
如果访问令牌已过期或即将过期(5 分钟内
窗口),然后刷新令牌(如果可用)用于获取新的
通过网络调用访问令牌。
它将重复此行为,直到刷新令牌过期。或者,您可以通过 utilizing forceRefresh 参数上的 AcquireTokenSilentAsync 上的 forceRefresh 参数强制刷新访问令牌
最后,我要引用 this answer on SO,因为它提供了有关 MSAL 和令牌的很好的见解
只是为了澄清一下,MSAL 实际上并不发行令牌
或决定令牌到期,而是摄取获取令牌
来自 Azure AD STS。
MSAL 将在过期后自动刷新您的访问令牌
调用 AcquireTokenSilentAsync 时。 .... 默认令牌
现在的到期时间是:
访问令牌:1 小时
刷新令牌:90 天,14 天非活动滑动窗口
(2017 年 6 月 13 日)
无论如何,对于我们应该多久调用一次,是否有“最佳实践”
AcquireTokenSilentAsync() ?我们是否应该跟踪到期
我们自己并调用这个方法来更新我们的承载认证
标题?我们是否应该在每次调用 AcquireTokenSilentAsync()
请求?
documentation 还列出了用于调用AcquireTokenSilentAsync 的“推荐调用模式”。文档also 提到了
对于公共客户端和机密客户端应用程序,MSAL.NET 维护一个令牌缓存(或在机密客户端应用程序的情况下为两个缓存),并且应用程序应先尝试从缓存中获取令牌,然后再通过其他任何方式。
根据我看到的示例,包括文档中推荐的调用模式,我认为您可以简单地调用 AcquireTokenSilentAsync 并捕获 MsalUiRequiredException 作为令牌已过期并且用户必须登录的指示又进来了。
我看不出使用 DelegateAuthenticationProvider 的 GraphServiceClient(切线主题,我知道)将如何做任何有用的 WRT 刷新。当令牌接近到期时,我们是否需要扩展该类并执行我们自己的刷新?我觉得这应该/应该已经在 SDK 中了。
如果我正确理解了 DelegateAuthenticationProvider,它所做的就是在我们将 requestMessage 传递给 Graph 之前对其进行修改。我们要做的就是为我们的访问令牌提供请求的授权标头。我们已经知道,当我们获取访问令牌时,它是有效的,所以我们可以添加它。
new DelegateAuthenticationProvider(async (requestMessage) =>
{
ConfidentialClientApplication cca = new ConfidentialClientApplication(_ClientId, _Authority, _RedirectUri, new ClientCredential(_ClientSecret), _UserTokenSessionCache.GetTokenCache(identifier, httpContext), _ApplicationTokenCache.GetTokenCache());
AuthenticationResult result = await cca.AcquireTokenSilentAsync();
requestMessage.Headers.Add("Authorization", result.CreateAuthorizationHeader());
//OR
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", result.AccessToken);
});
(在设置标题的任何一种方式之间都有no difference)
我一直走这条路,这对我有用。我强烈建议阅读他们的文档,因为它确实为如何实现 MSAL.Net 提供了很好的见解。
我还没有时间玩弄令牌持续时间。如果没有提供刷新令牌(如果可能的话)也不是行为
我希望这会有所帮助!