2017-10-18 15 views
12

私たちはB2Cを使用しており、顧客番号をユーザーに拡張フィールドとして格納しています。 1人のユーザーは1人以上の顧客を持つことができ、コンマで区切られた文字列で格納されます。私が今やっている何をユーザーのカスタムプロパティでActive Directory B2Cを検索する

は非常に非効率的である:それらが所望の拡張プロパティを持っている場合、それは私が望む顧客が含まれている場合 1.各ユーザー 3.確認の上、すべてのユーザーが 2.取得の拡張プロパティを取得します。 4.必要なユーザーのリストを作成します。

AdClientが、私はAdClientのを使用してのActiveDirectoryに1つのクエリでこれを行うことができるようにしたい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を通してですか? (すなわち、ユーザーはAD B2Cによって作成され、それを更新するためにGraph APIが使用されますか?) –

+0

はい、拡張フィールドでは、その形式の拡張プロパティを意味します。これらはグラフAPIを使用して作成されるか、より正確にはActiveDirectoryClientクラスを使用しており、これはバックグラウンドでGraph APIを使用していると仮定しています。 – ruffen

+0

はい、ActiveDirectoryClientはGraph APIをラップします。 ActiveDirectoryClient.Context.ExecuteAsync までの生のインターフェイスにアクセスして、@ nboettcherの回答からクエリを実行できます。しかし、$ filterは 'contains'演算をサポートせず、複数の値を持つプロパティに対しては 'startswith'と 'any'のみをサポートします(そして、複数値の拡張プロパティを作成することはできません):(将来、 (Azure AD Graph APIではなくMicrosoftがMicrosoft Graph APIへの動きを発表しました) – Aloraman

答えて

4

私はそのライブラリを使用していませんが、Graph APIを使用して非常によく似た検索を行っています。私は、私が探している2つの拡張属性値と一致するユーザーを探すフィルタを構築しました。フィルタは、次のようになります。

var filter = $"$filter={idpExtensionAttribute} eq '{userType.ToString()}' and {emailExtensionAttribute} eq '{emailAddress}'"; 

我々はまた、使用しているRESTは、希望のユーザーを返しますグラフAPIにPowerShellを経由して呼び出します。関連するフィルタを含む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(); 
    } 
} 
関連する問題