Мне по роду занятий часто приходится иметь дело с сервисами интегрирующимися с AD. К сожалению в большинстве таких сервисов напрочь отсутствует поддержка такой удобной «фичи» AD как Nested Groups
Неужели организовать перечисление всех вложенных групп пользователя так сложно?
На первый взгляд.
На первый взгляд для решения поставленной задачи как минимум потребуется организовать циклический вызов функций для получения групп, в которые входит группа пользователя и так далее. При таком подходе важно не забыть и обработать возможную ситуацию, когда группа A вложена в группу B, а группа B вложена в группу A.
А если проверка членства в группе вызывается достаточно часто, то такой подход может потребовать значительных вычислительных ресурсов.
Но выход есть.
Существует прекрасная статья Active Directory: LDAP Syntax Filters
В которой приведён интересный пример LDAP фильтра для получения групп пользователя, включая вложенные:
(member:1.2.840.113556.1.4.1941:=cn=Jim Smith,ou=West,dc=Domain,dc=com)
Также на MSDN есть статья Search Filter Syntax, описывающая имеющиеся Matching Rules, которые можно использовать в фильтрах LDAP совместно с Active Directory. В этой статье правило LDAP_MATCHING_RULE_IN_CHAIN описано более подробно:
Это правило применимо только к атрибутам типа distinguishedName. Этот специальный модификатор оператора совпадения позволяет обойти всё дерево вложенных объектов.
Таким образом задача обработки вложенности групп легко переносится на сервер AD.
Чем это знание может быть полезно администраторам?
Некоторые сервисы позволяют администратору при настройке задать LDAP фильтр для поиска групп пользователя — в таком случае администратор без вмешательства в код приложения может менять его поведение в отношении вложенных групп. Достаточно фильтры:
(member=cn=Jim Smith,ou=West,dc=Domain,dc=com)
(memberOf=cn=Sales,ou=West,dc=Domain,dc=com)
заменить на
(member:1.2.840.113556.1.4.1941:=cn=Jim Smith,ou=West,dc=Domain,dc=com)
(memberOf:1.2.840.113556.1.4.1941:=cn=Sales,ou=West,dc=Domain,dc=com)
Автор: Slipeer