2014-12-27 7 views
4

Azure AD에서 사용자 그룹 정보를 검색하려고합니다.Azure ActiveDirectory Graph API GraphClient가 AD 그룹을 반환하지 않음

I 성공적를 할 생각이

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

을 달성하기 위해 다음과 같은 그래프 API 패키지를 사용하여 Azure Graph API에서 사용자 정보를 검색합니다.

그러나 사용자의 그룹을 검색하기 위해이 메서드를 실행하면 Fiddler는 그룹 정보가 들어있는 JSON 부분에 성공적인 HTTP 200 응답을 표시하지만 메서드 자체는 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

저도 같은 문제가 있습니다. 결과는 유형 IEnumerable을하지 않기 때문에 내 코드가 문서 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<string> groups = await user.GetMemberGroupsAsync(false); 

위의 코드는 올바른 유형을 반환합니다.

관련 문제