2017-10-18 11 views
12

우리는 B2C를 사용하고 사용자에게 내선 번호 필드로 고객 번호를 저장합니다. 단일 사용자는 하나 이상의 고객을 가질 수 있으며 쉼표로 구분 된 문자열로 저장됩니다.사용자의 사용자 지정 속성으로 Active Directory B2C 검색

은 내가 지금 뭐하는 거지하는 것은 매우 비효율적이다 : 1. 그들이 원하는 확장 속성이있는 경우 각 사용자 3. 모든 사용자에게 2. 가져 오기 확장 등록 정보를 확인하고 그것이 내가 원하는 고객을 포함하는 경우. 4. 원하는 사용자 목록을 작성하십시오.

adClient입니다 내가 adClient입니다을 사용하여 액티브 디렉토리에 하나 개의 쿼리에서이 작업을 수행 할 수 있도록하려는 IActiveDirectoryClient

var users = (await GetAllElementsInPagedCollection(await AdClient.Users.ExecuteAsync())).ToList(); 
var customersUsers = users.Where(user => user.AccountEnabled.HasValue && user.AccountEnabled.Value).Where(user => 
    { 
     var extendedProperty = ((User) user).GetExtendedProperties().FirstOrDefault(extProp => extProp.Key == customersExtendedProperty.Name).Value?.ToString(); 
     return extendedProperty != null && extendedProperty.Contains(customerId); 
    }).ToList(); 

입니다. 이 방법을 사용하면 메서드가 지원되지 않는다는 오류가 발생합니다. 쿼리가 Active Directory에 쿼리하기 위해 쿼리를 작성하고 있다고 가정 할 때 의미가 있습니다.

편집 - 추가 정보 :

나는 다음과 같은 그래프 API를 조회 할 수 있었다 :

var authContext = await ActiveDirectoryClientFactory.GetAuthenticationContext(AuthConfiguration.Tenant, 
AuthConfiguration.GraphUrl, AuthConfiguration.ClientId, AuthConfiguration.ClientSecret); 
var url = $"https://graph.windows.net:443/hansaborgb2c.onmicrosoft.com/users?api-version=1.6&$filter={customersExtendedProperty.Name} eq '{customerId}'"; 
var users = await _graphApiHttpService.GetAll<User>(url, authContext.AccessToken); 

하지만, 내 예를 들어 내가 필터링 substringof를 사용해야하지만,이 지원되지 않습니다 Azure Graph API.

+0

에서 정상 DirectorySearcher 클래스를 사용하는 것, 그것은 "extension_guid_someName"형식의 이름을 가진 extenion의 속성입니다? 그리고 확장 속성은 처음에 사용자 계정에 어떻게 적용됩니까? 그것은 Graph API를 통해서입니까? (예 : 사용자가 광고 B2C로 만든 다음 그래프 API를 사용하여 업데이트합니다.) –

+0

예, 확장 필드 란 해당 형식의 확장 속성을 의미합니다. 그래프 API를 사용하여 생성되었거나 더 정확하게, ActiveDirectoryClient 클래스를 사용하고 있으며이 API가 백그라운드에서 그래프 API를 사용한다고 가정합니다. – ruffen

+0

예, ActiveDirectoryClient가 그래프 API를 래핑합니다. ActiveDirectoryClient.Context.ExecuteAsync 이후의 원시 인터페이스에 액세스하여 @ nboettcher의 대답에서 쿼리를 수행 할 수 있습니다. 그러나 $ filter는 'contains'연산을 지원하지 않으며, 'startswith'와 'any'만 다중 값 속성으로 사용할 수 있습니다. (다중 값 확장 속성을 생성 할 수 없습니다.) (아마도 미래에 희망이있을 수 있습니다. (하지만 Azure AD Graph API는 아니며 Microsoft는 Microsoft Graph API 로의 이동을 발표했습니다.) – Aloraman

답변

4

해당 라이브러리를 사용하고 있지는 않지만 Graph API를 사용하여 매우 유사한 검색을 수행하고 있습니다. 내가 찾고있는 두 가지 확장 속성 값과 일치하는 사용자를 찾는 필터를 만들었습니다. 필터는 다음과 같습니다.

또한 원하는 사용자를 반환하는 Graph API에 대해 PowerShell을 통해 REST 호출을 사용했습니다. 관련 필터가있는 URI는 다음과 같습니다.

https://graph.windows.net/$AzureADDomain/users?`$filter=extension_d2fbadd878984184ad5eab619d33d016_idp eq '$idp' and extension_d2fbadd878984184ad5eab619d33d016_email eq '$email'&api-version=1.6 

두 옵션 모두 필터 조건과 일치하는 사용자를 반환합니다. 당신이 "확장자"필드 말할 때

+0

마지막으로 이것을 테스트 할 시간이 있었으며 확장 속성을 쿼리 할 수 ​​있었지만 그 속성 중 일부를 검색 할 수는 없습니다. 문자열 (부분 문자열), 이것에 대해 어떤 생각을 갖고 있습니까? – ruffen

3

내가 System.DirectoryServices

private void Search() 
{ 
    // GetDefaultDomain as start point is optional, you can also pass a specific 
    // root object like new DirectoryEntry ("LDAP://OU=myOrganisation,DC=myCompany,DC=com"); 
    // not sure if GetDefaultDomain() works in B2C though :(
    var results = FindUser("extPropName", "ValueYouAreLookingFor", GetDefaultDomain()); 

    foreach (SearchResult sr in results) 
    { 
     // query the other properties you want for example Accountname 
     Console.WriteLine(sr.Properties["sAMAccountName"][0].ToString()); 
    } 
    Console.ReadKey(); 
} 

private DirectoryEntry GetDefaultDomain() 
{ // Find the default domain 
    using (var dom = new DirectoryEntry("LDAP://rootDSE")) 
    { 
     return new DirectoryEntry("LDAP://" + dom.Properties["defaultNamingContext"][0].ToString()); 
    } 
} 

private SearchResultCollection FindUser(string extPropName, string searchValue, DirectoryEntry startNode) 
{ 
    using (DirectorySearcher dsSearcher = new DirectorySearcher(startNode)) 
    { 
     dsSearcher.Filter = $"(&(objectClass=user)({extPropName}={searchValue}))"; 
     return dsSearcher.FindAll(); 
    } 
}