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