Azure active directory 需要关于在Microsoft.Graph中获取多任务访问令牌的建议吗

Azure active directory 需要关于在Microsoft.Graph中获取多任务访问令牌的建议吗,azure-active-directory,microsoft-graph-api,Azure Active Directory,Microsoft Graph Api,我过去只对Azure广告进行应用程序呼叫。 简而言之,我的代码如下(C#.NET 4.5): 以下是我的问题: 在并行运行的两个任务中使用相同的GraphServiceClient对象是否是一种良好的做法 我注意到这段代码第一次运行时,两个任务都调用以获取访问令牌,然后通过查询Azure AD。我是否应该尝试改进这一点并避免两个任务都获得访问令牌 附带问题:我需要做些什么来处理访问令牌的刷新吗 多谢各位 在并行运行的两个任务中使用相同的GraphServiceClient对象是否是一种良好的

我过去只对Azure广告进行应用程序呼叫。 简而言之,我的代码如下(C#.NET 4.5):

以下是我的问题:

  • 在并行运行的两个任务中使用相同的GraphServiceClient对象是否是一种良好的做法
  • 我注意到这段代码第一次运行时,两个任务都调用以获取访问令牌,然后通过查询Azure AD。我是否应该尝试改进这一点并避免两个任务都获得访问令牌
  • 附带问题:我需要做些什么来处理访问令牌的刷新吗
多谢各位

在并行运行的两个任务中使用相同的GraphServiceClient对象是否是一种良好的做法

答复如下:

图形客户端对象是线程安全的,并且是可重入的。它是一个包含配置、提供程序和帮助程序的容器,用于通过构建器模式构建请求对象

由于
GraphServiceClient
是线程安全的,因此可以跨多个线程重复使用同一实例。另外,如果您创建了许多
HttpClient
实例来访问相关的图形API,那么您可能还需要重新使用一组实例,或者您可能会遇到内存泄漏问题

我是否应该尝试改进这一点并避免两个任务都获得访问令牌

根据我的经验,您最好使用相同的访问令牌,而不是为每个任务生成令牌。此外,您还可以创建一个
TokenHelper
类来缓存获取的访问令牌并记录过期时间。在
GetTokenAsync
方法下,您需要验证当前的访问令牌(如果为空,则获取一个新令牌;如果令牌即将过期,则再次获取一个新令牌)

注意:令牌助手.GetTokenAsync方法可能需要是线程安全的

Task userQueryTask = Task.Run(async () =>
{
    IGraphServiceUsersCollectionPage users = await connection.GraphService.Users.Request().Select(userSelect).Filter(userFilter).GetAsync();
}, cts.Token);

Task groupQueryTask = Task.Run(async () =>
{
    IGraphServiceGroupsCollectionPage groups = await connection.GraphService.Groups.Request().Select(groupSelect).Filter(groupFilter).GetAsync();
}, cts.Token);

Task.WaitAll(new Task[2] { userQueryTask, groupQueryTask }, Constants.timeout, cts.Token);
var graphClient = new GraphServiceClient(
            "https://graph.microsoft.com/v1.0",
            new DelegateAuthenticationProvider(
                async (requestMessage) =>
                {
                    var token = await TokenHelper.GetTokenAsync();
                    requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", token);
                }));