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

3

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

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

有人可以指导一下我为什么会发生这种情况吗?或者是否有说明这个流程的文档。

可能是默认的令牌缓存对您的情况不起作用。您可能需要实现一个正确持久化的令牌缓存,MSAL应用程序对象将使用它来存储帐户和令牌。 - juunas
1个回答

4
MSAL会维护一个令牌缓存,并在获取了令牌后将其缓存。它还有能力在令牌即将过期时(因为令牌缓存包含刷新令牌),刷新令牌。
出于安全原因,MSAL.NET不公开刷新令牌:MSAL通过令牌缓存来处理令牌的刷新。
如果在令牌到期时AAD很忙,访问令牌会失效,导致应用程序无法使用。你可以通过定期强制刷新来提高应用程序的可用性。我们建议每30分钟或AT寿命的一半强制刷新。默认情况下,访问令牌在1小时后过期。如果是自定义生命周期,则需要相应更改。通过 GetAccountsAsync()始终获得空结果时,请检查Token Cache serialization
result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
             .WithForceRefresh(true)
             .ExecuteAsync();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接