无法从Azure Active Directory获取用户组

时间:2017-03-07 14:17:42

标签: c# azure-active-directory

我正在尝试使用下面的代码段从Azure Active Directory获取用户组信息。

public async Task<List<string>> GetUserGroupsAsync(string alias)
{
            var groupList = new List<string>();
            try
            {
                Microsoft.Azure.ActiveDirectory.GraphClient.IUser userObject = getUserObject(alias);
                Task t = Task.Run(async () =>
                {
                    var grouppages = await ((IUserFetcher)userObject).MemberOf.OfType<Microsoft.Azure.ActiveDirectory.GraphClient.Group>().ExecuteAsync();
                    do
                    {
                        groupList.AddRange(grouppages.CurrentPage.Select(g => g.Mail != null ? g.Mail.Trim() : null).Where(eMail => !string.IsNullOrWhiteSpace(eMail)).ToList());
                        grouppages = await grouppages.GetNextPageAsync();
                    } while (grouppages != null);
                });
                t.Wait();
            }
            catch
            {
                throw;
            }
            return groupList;
}

问题:对于某些用户,我的情况低于例外情况。

System.AggregateException: One or more errors occurred. ---> System.AggregateException: One or more errors occurred. ---> System.AggregateException: One or more errors occurred. ---> Microsoft.Data.OData.ODataErrorException: The specified page token value has expired and can no longer be included in your request. ---> System.Data.Services.Client.DataServiceQueryException: An error occurred while processing this request. ---> System.Data.Services.Client.DataServiceClientException: {"odata.error":{"code":"Directory_ExpiredPageToken","message":{"lang":"en","value":"The specified page token value has expired and can no longer be included in your request."}}}
   at System.Data.Services.Client.BaseAsyncResult.EndExecute[T](Object source, String method, IAsyncResult asyncResult)
   at System.Data.Services.Client.QueryResult.EndExecuteQuery[TElement](Object source, String method, IAsyncResult asyncResult)
   --- End of inner exception stack trace ---
   at System.Data.Services.Client.QueryResult.EndExecuteQuery[TElement](Object source, String method, IAsyncResult asyncResult)
   at System.Data.Services.Client.DataServiceRequest.EndExecute[TElement](Object source, DataServiceContext context, String method, IAsyncResult asyncResult)
   at System.Data.Services.Client.DataServiceContext.EndExecute[TElement](IAsyncResult asyncResult)
   at Microsoft.Azure.ActiveDirectory.GraphClient.Extensions.DataServiceContextWrapper.<ExecuteAsync>b__6b[TSource,TInterface](IAsyncResult i)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)

请帮助解决此问题。这将非常有帮助。

1 个答案:

答案 0 :(得分:0)

根据我的理解,当我们尝试逐页检索群组成员时会发生异常(The specified page token value has expired and can no longer be included in your request.),但同时还有其他人正在操纵群组成员,例如添加或删除。

我们需要在代码中处理此异常。例如,我们可以通知用户和信息用户在我们收到此异常后重试以获取成员。