如何在 MSAL .Net C# 中获取刷新令牌

pra*_*ria 3 c# azure exchangewebservices azure-active-directory azure-ad-msal

我已经确定了两种在 EWS 的 MSAL 中获取令牌的方法

  1. 采用用户名密码的方式。
  2. 使用守护进程机密方法。

在我获取令牌后的上述两种方法中,我无法刷新它。虽然我尝试遵循 MS 文档但没有成功。GetAccountsAsync() 始终给出空结果。

这是我的用户名密码方法的代码

var publicClientApplication = PublicClientApplicationBuilder.Create(ClientId)
                 .WithAuthority(AzureCloudInstance.AzurePublic, TenantId).Build();
var accounts = publicClientApplication.GetAccountsAsync().GetAwaiter().GetResult();
var result = publicClientApplication
                 .AcquireTokenSilent(scopes, accounts.FirstOrDefault())
                 .ExecuteAsync().GetAwaiter().GetResult();
Run Code Online (Sandbox Code Playgroud)

谁能指导我为什么会这样,或者有没有文档解释这个流程。

Joe*_*Cai 5

MSAL 维护令牌缓存并在获取令牌后对其进行缓存。它还能够在令牌接近过期时刷新令牌(因为令牌缓存还包含刷新令牌)。

出于安全原因, MSAL.NET 不会公开刷新令牌:MSAL 使用令牌缓存为您处理刷新令牌。

由于您GetAccountsAsync()总是变空,因此您的令牌缓存序列化了。

默认情况下,访问令牌会在 1 小时后过期,如果令牌过期时 AAD 正忙,您的应用程序将变得不可用,因为您无法获取有效的访问令牌。您可以通过定期强制刷新来提高应用程序的可用性。我们建议每 30 分钟强制刷新一次,如果这是自定义生命周期,则为 AT 生命周期的一半。

result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
             .WithForceRefresh(true)
             .ExecuteAsync();
Run Code Online (Sandbox Code Playgroud)