Frage Durchsuchen von Active Directory B2C nach benutzerdefinierter Eigenschaft für Benutzer


Wir verwenden B2C und speichern Kundennummern als Extension-Feld für Benutzer. Ein einzelner Benutzer kann einen oder mehrere Kunden haben und sie werden in einer durch Komma getrennten Zeichenfolge gespeichert.

Was ich gerade mache ist sehr ineffizient:  1. Holen Sie sich alle Benutzer  2. Erhalte Erweiterungseigenschaften für jeden Benutzer  3. Prüfen Sie, ob sie die gewünschte Erweiterungseigenschaft haben und ob sie den gewünschten Kunden enthält.  4. Erstellen Sie eine Liste der Benutzer, die ich möchte.

Adclient ist 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();

Ich möchte dies in einer Abfrage an ActiveDirectory mit dem AdClient tun können. Wenn ich das versuche, bekomme ich Fehler, dass die Methoden nicht unterstützt werden, was sinnvoll ist, da ich annahm, dass hinter den Kulissen eine Abfrage erstellt wird, um Active Directory abzufragen.

Bearbeiten - zusätzliche Informationen:

Ich konnte Graph API wie folgt abfragen:

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);

In meinem Beispiel muss ich jedoch verwenden Unterzeichenfolge zu filtern, aber dies wird von Azure Graph API nicht unterstützt.


12
2017-10-18 09:30


Ursprung


Antworten:


Ich verwende diese Bibliothek nicht, aber wir machen eine sehr ähnliche Suche mit der Graph-API. Ich habe einen Filter erstellt, der nach Benutzern sucht, die zwei Erweiterungsattributwerten entsprechen, nach denen ich suche. Der Filter sieht so aus:

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

Wir haben auch REST-Aufrufe über PowerShell für die Graph-API verwendet, die die gewünschten Benutzer zurückgibt. Der URI mit dem zugehörigen Filter sieht folgendermaßen aus:

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

Beide Optionen geben alle Benutzer zurück, die den Filterkriterien entsprechen.


4
2017-10-25 22:20



Ich würde normale DirectorySearcher-Klasse von System.DirectoryServices verwenden

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();
    }
}

3
2017-10-26 08:21