2014-12-27 4 views
4

Я хочу получить информацию о группе пользователей из Azure AD.Azure ActiveDirectory Graph API GraphClient не возвращает группы AD

Используя следующую Graph пакеты API для достижения этого

  • Microsoft.Azure.ActiveDirectory.GraphClient
  • Microsoft.IdentityModel.Clients.ActiveDirectory 2.13.112191810

Я могу успешно получить информацию о пользователях из API Azure Graph.

Но когда я запускаю этот метод для извлечения групп пользователей, Fiddler показывает успешный ответ HTTP 200 с фрагментом JSON, содержащим информацию о группе, однако сам метод не возвращается с IEnumerable.

IEnumerable<string> groups = user.GetMemberGroupsAsync(false).Result.ToList(); 

Код, похоже, не возвращается из этого асинхронного запроса.

Полученный опыт - пустая страница, в то время как конвейер аутентификации застревает.

Полный код

public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal) 
    { 
     if (!incomingPrincipal.Identity.IsAuthenticated == true && 
      _authorizationService.IdentityRegistered(incomingPrincipal.Identity.Name)) 
     { 
      return base.Authenticate(resourceName, incomingPrincipal); 
     } 

     _authorizationService.AddClaimsToIdentity(((ClaimsIdentity) incomingPrincipal.Identity)); 

     Claim tenantClaim = incomingPrincipal.FindFirst(TenantIdClaim); 

     if (tenantClaim == null) 
     { 
      throw new NotSupportedException("Tenant claim not available, role authentication is not supported"); 
     } 

     string tenantId = tenantClaim.Value; 
     string authority = String.Format(CultureInfo.InvariantCulture, _aadInstance, _tenant); 
     Uri servicePointUri = new Uri("https://graph.windows.net"); 
     ClientCredential clientCredential = new ClientCredential(_clientId, _password); 

     AuthenticationContext authContext = new AuthenticationContext(authority, true); 
     AuthenticationResult result = authContext.AcquireToken(servicePointUri.ToString(), clientCredential); 
     Token = result.AccessToken; 

     ActiveDirectoryClient activeDirectoryClient = 
      new ActiveDirectoryClient(new Uri(servicePointUri, tenantId), 
       async() => await AcquireTokenAsync()); 

     IUser user = activeDirectoryClient 
      .Users 
      .Where(x => x.UserPrincipalName.Equals(incomingPrincipal.Identity.Name)) 
      .ExecuteAsync() 
      .Result 
      .CurrentPage 
      .ToList() 
      .FirstOrDefault(); 

     if (user == null) 
     { 
      throw new NotSupportedException("Unknown User."); 
     }   

     IEnumerable<string> groups = user.GetMemberGroupsAsync(false).Result.ToList(); 


     return incomingPrincipal; 
    } 

ответ

4

У меня такая же проблема. Мой код работает после изменения в соответствии с документацией https://github.com/AzureADSamples/ConsoleApp-GraphAPI-DotNet

 IUserFetcher retrievedUserFetcher = (User) user; 
     IPagedCollection<IDirectoryObject> pagedCollection = retrievedUserFetcher.MemberOf.ExecuteAsync().Result; 
     do { 
      List<IDirectoryObject> directoryObjects = pagedCollection.CurrentPage.ToList(); 
      foreach (IDirectoryObject directoryObject in directoryObjects) { 
       if (directoryObject is Group) { 
        Group group = directoryObject as Group; 
        ((ClaimsIdentity)incomingPrincipal.Identity).AddClaim(
         new Claim(ClaimTypes.Role, group.DisplayName, ClaimValueTypes.String, "GRAPH")); 
       } 
      } 
      pagedCollection = pagedCollection.GetNextPageAsync().Result; 
     } while (pagedCollection != null && pagedCollection.MorePagesAvailable); 
+0

У меня такая же проблема. Обратите внимание, однако решение выше с использованием 'memberOf' является непереходным списком, т. Е. Только для непосредственных членов. Функция 'getMemberGroups', которая не работает, является транзитивной. Вам также нужно будет выполнять итерацию групп групп. Из [doco] (https://msdn.microsoft.com/Library/Azure/Ad/Graph/api/users-operations#UserFunctions) «Вы можете вызвать функцию getMemberGroups, чтобы вернуть все группы, в которых пользователь является членом из. Проверка транзитивна, в отличие от чтения свойства навигации memberOf, которое возвращает только те группы, в которых пользователь является прямым членом. " – mgrowan

+0

У меня такая же проблема с большинством моих вызовов, которые я пытался сделать с этой библиотекой. Он постоянно висит, хотя Fiddler показывает, что был сделан успешный запрос. –

0

IEnumerable, string groups = user.GetMemberGroupsAsync(false).Result.ToList() не работает, так как результат не типа IEnumerable, строка.

IEnumerable<string> groups = await user.GetMemberGroupsAsync(false); 

Выше кода вернет правильный тип.

Смежные вопросы