【发布时间】:2021-12-22 04:13:41
【问题描述】:
我正在创建一个在后台运行的后端服务,无需直接的用户交互。它是用 .NET 4.8 编写的,并作为 Windows 服务运行。 该应用程序将与 Graph API 的一些端点(/users 和 /groups)进行交互,这意味着创建我自己的 HttpClient 很容易,因为调用的端点数量是有限的。 应用程序应根据客户端密码从 Azure 获取访问令牌。 我一直在使用 ConfidentialClientApplicationBuilder 并使用 Microsoft.Identity.Client 命名空间的 AcquireTokenForClient() 方法从 Azure 获取可用于对 Graph 的任何进一步调用的有效访问令牌,但问题是,我没有得到AcquireTokenForClient() 的响应中有一个 refresh_token,据我所知没有内置的刷新机制?
private async Task<string> AcquireAccessTokenAsync()
{
try
{
var app = ConfidentialClientApplicationBuilder.Create("MyClientId")
.WithClientSecret("MyClientSecret")
.WithAuthority(new Uri("MyAuthority"))
.Build();
var acquireResult = await app.AcquireTokenForClient("RequiredScopes").ExecuteAsync();
return acquireResult.AccessToken;
}
catch (MsalClientException ex)
{
Console.WriteLine(ex);
throw new ApplicationException("Failed to acquire access token from Azure.");
}
}
感觉使用 Graph SDK(Graph Client)对于这项任务来说有点矫枉过正,这就是我尝试使用 MSAL .NET 库的原因。但是,在构建需要集成到 Microsoft Graph 的后端服务时,应该使用什么库?它如何支持令牌刷新机制?
【问题讨论】:
-
使用客户端凭据流不使用刷新令牌。如果 API 调用因过期令牌而失败,you just go get an new one and then try the call again。
-
@ourmandave 经过数小时的图书馆研究,这也是我的结论。而且,以防万一有人在搜索与我相同的答案,则 AcquireTokenForClient 会在内部处理令牌缓存,这意味着如果缓存中有有效令牌,它不会请求新令牌,直到没有有效令牌留在缓存中。请留下答案,以便我关闭此问题。
标签: c# .net microsoft-graph-api msal