我对OAuth2以及AccessToken和RefreshToken的概念相当熟悉。
看起来MSAL在使用ClientApplicationBase.AcquireTokenSilentAsync()时正在为我们做一些工作。
我尚不清楚它是否将始终检查当前AccessToken的到期并在方法调用时自动刷新(使用RefreshToken)。
无论如何,我们应该多久调用一次AcquireTokenSilentAsync()的“最佳实践”?我们是否应该自己跟踪到期并调用此方法来更新我们的承载认证标头?我们应该在每个请求上调用AcquireTokenSilentAsync()吗?(疑)
我看不到使用DelegateAuthenticationProvider的GraphServiceClient(正切主题,我知道)如何对WRT刷新有所帮助。当令牌即将到期时,我们是否需要扩展该类并执行我们自己的刷新?我觉得这应该已经在SDK中。
感谢您的提示。-AJ
我尚不清楚它是否将始终检查当前AccessToken的到期并在方法调用时自动刷新(使用RefreshToken)。
offline_access如果我正确理解此答案,则在提供范围时会自动提供刷新令牌
...您已请求
offline_access范围,因此您的应用会收到一个刷新令牌。
该说明的AcquireTokenSilentAsync暗示提供了刷新令牌时,它会检查令牌上的失效日期,并获得一个新的,如果它过期或即将过期。
如果访问令牌已过期或接近到期(在5分钟窗口内),则使用刷新令牌(如果有)通过进行网络调用来获取新的访问令牌。
它将重复此行为,直到刷新令牌过期为止。(可选)您可以使用以下forceRefresh参数通过刷新令牌来强制刷新访问令牌:AcquireTokenSilentAsync
最后,我将在SO上引用此答案,因为它可以很好地了解MSAL和令牌
仅作一点说明,MSAL实际不发行令牌或确定令牌到期,而是从Azure AD STS摄取获取令牌。
调用AcquireTokenSilentAsync时,MSAL将在过期后自动刷新您的访问令牌。....现在的默认令牌到期时间是:
存取凭证:1小时
刷新令牌:90天,14天不活动的滑动窗口
(17年6月13日)
无论如何,我们应该多久调用一次AcquireTokenSilentAsync()的“最佳实践”?我们是否应该自己跟踪到期并调用此方法来更新我们的承载认证标头?我们应该在每个请求上调用AcquireTokenSilentAsync()吗?
该文档还列出了用于调用的“推荐的呼叫模式” AcquireTokenSilentAsync。该文档还提到
对于公共客户端应用程序和机密客户端应用程序,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);
});
Run Code Online (Sandbox Code Playgroud)
(设置标题的两种方法之间没有区别)
我一直走这条路,这对我有用。我强烈建议阅读他们的文档,因为它确实对如何实现MSAL.Net提供了很好的见解。
我还没有时间玩令牌持续时间。如果没有提供刷新令牌,也没有行为(如果可能的话)
我希望这有帮助!
| 归档时间: |
|
| 查看次数: |
1731 次 |
| 最近记录: |