任务:我需要创建一个WPF应用程序,它将与EWS(Exchange Web-service(一起使用。我也有 2 个限制:
- 登录应仅进行一次(应使用刷新令牌重新连接(
- 它应该支持 2FA
我的解决方案部分:我使用 OAuth 连接到 Azure AD。作为OAuth客户端,我使用Microsoft.Identity.Client。对于第一次登录,我有这样的代码:
var pcaOptions = new PublicClientApplicationOptions
{
ClientId = *my_client_id*,
TenantId = *my_tenant*
};
AuthenticationResult authResult = pca.AcquireTokenInteractive(ewsScopes).ExecuteAsync().Result;
这部分代码显示一个 WPF 窗口,我在其中输入凭据并返回一个结果 (AuthenticationResult(,其中包含访问令牌。
问题:身份验证结果没有刷新令牌,因此我无法满足第一个限制。是否有任何解决方案或方法?
其他问题:如何使用 Microsoft.Identity.Client 更新刷新令牌?
出于安全原因,MSAL.NET 不会公开刷新令牌:MSAL 使用令牌缓存为你处理刷新令牌。
MSAL 维护令牌缓存,并在获取令牌后缓存令牌。它还能够在令牌即将过期时刷新令牌(因为令牌缓存还包含刷新令牌(。
您可以通过定期使用WithForceRefresh来提高应用程序的可用性,当设置为true
时,它将在内部获取新的访问令牌
result = await app.AcquireTokenSilent(scopes, accounts.FirstOrDefault())
.WithForceRefresh(true)
.ExecuteAsync();