Как написать запрос LDAP для проверки, является ли пользователь членом группы?
Я хочу написать запрос LDAP, который проверяет, является ли пользователь (sAMAccountName) членом определенной группы. Можно ли сделать это, чтобы получить либо 0, либо 1 результат?
Наверное, я могу получить все группы для пользователя и проверить каждый из них для соответствия, но мне было интересно, могу ли я упаковать его в одно выражение LDAP.
Есть идеи?
- Как получить данные Active Directory текущего пользователя в C #
- Вложенное членство в группе ldap
- Синтаксис корневого запроса LDAP для поиска более чем одного конкретного подразделения
- Может ли PostgreSQL ограничить уникальность элементов массива?
- Как подключиться к Active Directory с помощью Linux-машины
благодаря
- Как получить все группы AD для определенного пользователя?
- Что происходит на проводе при настройке соединения TLS / LDAP или TLS / HTTP?
- Что такое CN, OU, DC в поиске LDAP?
- Подключение к LDAP с C # с помощью DirectoryServices
- Как проверить учетные записи Active Directory по протоколу LDAP + SSL?
- Как подключиться к Java в Active Directory
- Active Directory (LDAP) - проверка заблокированной учетной записи / срок действия пароля истек
- Аутентификация Active Directory с помощью Java на Linux
Здесь вы можете создать запрос с этим фильтром:
(&(objectClass=user)(sAMAccountName=yourUserName) (memberof=CN=YourGroup,OU=Users,DC=YourDomain,DC=com))
и когда вы запускаете это на своем LDAP-сервере, если вы получите результат, ваш пользователь «yourUserName» действительно является членом группы «CN = YourGroup, OU = Users, DC = YourDomain, DC = com
Попробуйте посмотреть, работает ли это!
Если вы используете C # / VB.Net и System.DirectoryServices, этот fragment должен сделать трюк:
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"); }
Осторожно: это будет проверяться только на непосредственное членство в группах, и оно не будет проверять членство в так называемой «первичной группе» (обычно «cn = Пользователи») в вашем домене. Он не обрабатывает вложенные членства, например, Пользователь А является членом Группы А, который является членом Группы В, - тот факт, что Пользователь А действительно является членом Группы В, также не находит отражения здесь.
Марк
Если вы используете OpenLDAP (то есть slapd), который является общим для серверов Linux, тогда вы должны включить элемент overlay для сопоставления с фильтром, используя атрибут (memberOf = XXX).
Кроме того, после включения оверлея он не обновляет атрибуты memberOf для существующих групп (вам нужно будет удалить существующие группы и снова добавить их обратно). Если вы включили оверлей, когда firebase database была пуста, вы должны быть в порядке.
Я добавлю еще один ответ Марку: атрибут memberOf не может содержать подстановочные знаки, поэтому вы не можете сказать что-то вроде «memberof = CN = SPS *» и ожидать, что он найдет все группы, начинающиеся с «SPS».
Вы должны установить базу запросов в DN соответствующего пользователя, а затем установить свой фильтр в DN группы, о которой вы задаетесь вопросом, являются ли они членами. Чтобы узнать, является ли jdoe членом группы, тогда ваш запрос будет выглядеть примерно так:
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)'
Если вы хотите видеть ВСЕ группы, в которых он участвует, просто запросите только атрибут ‘memberof’ в вашем поиске, например:
ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host **memberof**