Come scrivere una query LDAP per verificare se l'utente è membro di un gruppo?


129

Voglio scrivere una query LDAP che verifica se un utente (sAMAccountName) è un membro di un determinato gruppo. È possibile farlo in modo da ottenere 0 o 1 record dei risultati?

Immagino di poter ottenere tutti i gruppi per l'utente e testare ognuno per una corrispondenza, ma mi chiedevo se potevo comprimerlo in un'espressione LDAP.

Qualche idea?

Grazie


Risposte:


177

Dovresti essere in grado di creare una query con questo filtro qui:

(&(objectClass=user)(sAMAccountName=yourUserName)
  (memberof=CN=YourGroup,OU=Users,DC=YourDomain,DC=com))

e quando lo esegui sul tuo server LDAP, se ottieni un risultato, il tuo utente "yourUserName" è effettivamente un membro del gruppo "CN = YourGroup, OU = Users, DC = YourDomain, DC = com

Prova a vedere se funziona!

Se usi C # / VB.Net e System.DirectoryServices, questo snippet dovrebbe fare il trucco:

DirectoryEntry rootEntry = new DirectoryEntry("LDAP://dc=yourcompany,dc=com");

DirectorySearcher srch = new DirectorySearcher(rootEntry);
srch.SearchScope = SearchScope.Subtree;

srch.Filter = "(&(objectClass=user)(sAMAccountName=yourusername)(memberOf=CN=yourgroup,OU=yourOU,DC=yourcompany,DC=com))";

SearchResultCollection res = srch.FindAll();

if(res == null || res.Count <= 0) {
    Console.WriteLine("This user is *NOT* member of that group");
} else {
    Console.WriteLine("This user is INDEED a member of that group");
}

Avvertenza: questo verificherà solo l'appartenenza immediata ai gruppi e non verificherà l'appartenenza a quello che viene chiamato il "gruppo primario" (di solito "cn = Users") nel tuo dominio. Non gestisce le appartenenze nidificate, ad esempio l'utente A è membro del gruppo A che è membro del gruppo B - il fatto che anche l'utente A sia effettivamente un membro del gruppo B non si riflette qui.

Marc


1
Ho provato, ma ancora non funziona per me. Dovrebbe essere 'OU = Users' o 'OU = Groups' nella clausola memberOf?
paul

3
Questa è la mia domanda: (& (objectClass = person) (sAMAccountName = USERID) (memberof = 'CN = SPSAdmins, OU = Groups, OU = MYTOWN, OU = Germany, OU = MYCOMPANY, DC = MYTOWN, DC = MYCOMPANY, DC = com ')) Il DN è davvero così lungo. Sono d'accordo che dovrebbe funzionare. Grazie dell'aiuto!
paul

3
Per un capriccio ho rimosso le virgolette singole dopo memberof e ora ottengo un risultato! Grazie
paul

2
Buona risposta. ma va sottolineato che funzionerà solo nei server LDAP che mantengono un attributo 'memberOf'. La tecnica più generale consiste nel recuperare l' oggetto gruppo ed esaminare i suoi attributi uniqueMember, roleOccupant, ecc. Per il DN dell'utente, a seconda dello schema utilizzato dall'oggetto gruppo.
Marchese di Lorne,

1
I nomi e i valori degli attributi LDAP di @Gunslinger non fanno distinzione tra maiuscole e minuscole, né lo sono i DN, ma AD ha le sue regole ...
Marchese di Lorne

35

Se si utilizza OpenLDAP (ovvero slapd), che è comune sui server Linux, è necessario abilitare il membro overlay in modo che possa corrispondere a un filtro utilizzando l'attributo (memberOf = XXX).

Inoltre, una volta abilitato l'overlay, non aggiorna gli attributi memberOf per i gruppi esistenti (sarà necessario eliminare i gruppi esistenti e aggiungerli di nuovo). Se hai abilitato la sovrapposizione per iniziare, quando il database era vuoto, dovresti essere OK.


8
Un collegamento a una pagina che spiega come abilitare il membro di overlay sarebbe utile immagino.
Gokhan Sari,

5
Tutorial che ha funzionato per me: schenkels.nl/2013/03/… @Telford Tendrys, amico, mi hai salvato la vita con questo avviso sui gruppi preesistenti. Grazie molto!
ŁukaszBachman,

21

Aggiungerei un'altra cosa alla risposta di Marc: l'attributo memberOf non può contenere caratteri jolly, quindi non puoi dire qualcosa come "memberof = CN = SPS *", e aspettarti che trovi tutti i gruppi che iniziano con "SPS".


Grazie per queste informazioni Ho cercato di fare ciò che dici non può essere fatto. Come posso fare per farlo con PHP? È possibile avere lo stesso risultato in un altro modo? per trovare tutti i gruppi iniziano con SPS e poi qualunque cosa ... Posso sempre afferrare tutto e mettere in loop il mio array quindi preg match con la CN che voglio, ma preferisco cercarlo direttamente se possibile.
ODelibalta,

15

Devi impostare la tua base di query sul DN dell'utente in questione, quindi impostare il filtro sul DN del gruppo di cui ti stai chiedendo se sono membri. Per vedere se jdoe è un membro del gruppo di ufficio, la tua query sarà simile a questa:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host '(memberof=cn=officegroup,dc=example,dc=local)'

Se vuoi vedere TUTTI i gruppi di cui è membro, richiedi solo l'attributo 'memberof' nella tua ricerca, in questo modo:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host **memberof**
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.