Lokaler Nutzerfilter für ein Microsoft Graph Benutzerverzeichnis

Um bestimmte Einschränkungen der MS Graph API zu umgehen, haben wir einen lokalen Nutzerfilter in Haiilo eingeführt. Zu diesen Einschränkungen der MS Graph API gehören derzeit z.B. das Filtern von Nutzern nach ihren Gruppenmitgliedschaften, falls diese Filtergruppen nicht Teil der synchronisierten Gruppen sind. Während eine solche Anforderung leicht mit einem LDAP-Ausdruck erfüllt werden kann, ist dies mit einer MS Graph API Abfrage nicht möglich.

Aufbau

Unser lokaler Nutzerfilter funktioniert genau wie der normale Benutzerfilter aber enthält einen OData-Filterausdruck. Der Unterschied besteht darin, dass er nicht Teil der Abfrage an die MS Graph API ist, sondern innerhalb von Haiilo auf die erhaltene Antwort ausgeführt wird. Dadurch wird effektiv ein zweistufiger Nutzerfilter geschaffen.

Das Ziel ist es, damit die Größe der MS Graph-Antwort zu minimieren, indem ihr so viel wie möglich in der ersten Stufe über den Standard Nutzerfilter filtert und dann zusätzlich Ausdrücke in der zweiten Stufe durch unseren lokalen Nutzerfilter verwendet, die MS Graph nicht unterstützt. Syntax und Grammatik entsprechen denen von OData-Filterausdrücken, genau wie der reguläre MS Graph-Nutzerfilter.

Alle im lokalen Nutzerfilter verwendeten Eigenschaften müssen in der Abfrage ausgewählt werden, damit sie in der MS Graph-Antwort erscheinen. Dies geschieht automatisch, ebenso wie die Unterscheidung zwischen auswählbaren und erweiterbaren Eigenschaften. Allerdings gibt es Grenzen der MS Graph API, die schnell erreicht werden können. Zum Beispiel ist nur eine erweiterbare Eigenschaft in einer Abfrage erlaubt.

Wenn du im lokalen Benutzerfilter nach "memberOf" filterst und in der Profilfeldzuordnung "extensions" verwendest oder das Managerfeld synchronisierst, dann ist das Limit bereits überschritten.

Unterstütze OData Ausdrücke

Auf Grund technischer Begebenheiten dieser Ausdrücke ist diese Liste auf Englisch gehalten:

  • Equality operators
    • Equals (eq)
    • Not equals (ne)
    • Logical negation (not)
    • In (in)
  • Relational operators
    • Less than (th)
    • Greater than (gt)
    • Less than or equal to (le)
    • Greater than or equal to (ge)
  • Lambda operators
    • Any (any)
    • All (all)
    • Conditional operators
    • And (and)
    • Or (or)
  • Functions
    • Starts with (startsWith)
    • Ends with (endsWith)
    • Contains (contains)
  • Parentheses for grouping of operators
  • Data types:
    • null 
    • strings
    • integers
    • booleans
    • GUID

Du kannst mit der offiziellen Microsoft-Dokumentation für Filter vergleichen.

Vereinfachung von OData Ausdrücken

Die folgenden Regeln helfen bei der Vereinfachung von Ausdrücken, die die Operatoren "any", "all" und "in" verwenden, indem sie boolesche Algebra nutzen:

x/any(p:expr1) or x/any(p:expr2) = x/any(p:expr1 or expr2)
x/any(p:expr1) and x/any(p:expr2) : can not be simplified
x/all(p:expr1) and x/all(p:expr2) = x/all(p:expr1 and expr2)
x/all(p:expr1) or x/all(p:expr2) : can not be simplified
(x eq a) or (x eq b) = x in (a, b)

Beispiele

Ihr habt eine Gruppe mit dem Namen "A" und eine andere mit dem Namen "B", und ihr möchtet Nutzer synchronisieren, die Mitglied beider Gruppen sind, aber ihr möchtet nicht alle Nutzer von "A" und "B" gleichzeitig synchronisieren.

Ein Filterausdruck, der diese Anforderungen erfüllt, wäre entsprechend:

memberOf/any(m:m/displayName eq 'A') and memberOf/any(m:m/displayName eq 'B')

Oder ihr möchtet nur die Nutzer auswählen, deren Bürostandort "London" ist. Überraschenderweise wird dieser Filter von der MS Graph-API einfach ignoriert, aber mit diesem lokalen Nutzerfilter könnt ihr dies erreichen:

manager/city eq 'London'

Einschränkungen

MS Graph

  • Es sind nicht mehr als 2 erweiterbare Eigenschaften erlaubt.

Lokale OData Syntax und Grammatik

  • Erweiterbare Sammlungen: nur 'memberOf' ist derzeit erlaubt
  • Bei den Eigenschaftsnamen wird zwischen Groß- und Kleinschreibung unterschieden. Verwenden Sie 'memberOf' und nicht 'memberof'.
  • Der Vergleich von Sammlungen und komplexen Objekten wird nicht unterstützt
  • Nicht unterstützte Grammatik:
    • data types: date, time, duration, decimal, geography, geometry
    • OData 4 functions: length, indexof, substring, tolower, toupper, trim, concat
    • 'has' operator
    • namespaces
    • compound keys
    • bound functions
    • qualified entities
    • enum types

War dieser Beitrag hilfreich?