仅从 LDAP 过滤器获取间接组成员资格

Getting only indirect group memberships from LDAP filter

我正在编写一个 C# 方法来获取用户的组成员身份。对于每个组,我需要知道用户是直接成员还是间接成员(由于组嵌套)。

我的第一次尝试:

groupSearch.Filter = $"(&(objectCategory=group)(member:1.2.840.113556.1.4.1941:={userDistinguishedName})

这会获取直接和间接组成员身份,但无法区分组是直接组还是间接组。

我的下一次尝试是获取一个仅包含直接成员资格的列表,以及另一个仅包含间接成员资格的列表,然后将它们连接起来。我知道可以使用以下过滤器获取直接会员列表:

groupSearch.Filter = $"(&(objectCategory=group)(member={userDistinguishedName})

是否有等效的方法来获取间接成员资格列表?例如:

groupSearch.Filter = $"(&(objectCategory=group)(member-indirect={userDistinguishedName})

the documentation 看来不可能。

我找到的唯一解决方案是从 AD 获取直接成员列表和所有成员列表,并取两个列表的交集(基于组的 objectGUID),结果在间接成员列表中:

var userADGroups = _user.FindUserGroups(distinguishedName);
var userADGroups_directOnly = _user.FindUserGroups(distinguishedName, directMembershipOnly: true);
var userADGroups_indirectOnly = userADGroups.Where(x => userADGroups_directOnly.All(y => x.ObjectGuid != y.ObjectGuid));

尝试使用 LDAP_MATCHING_RULE_IN_CHAIN

LDAP_MATCHING_RULE_IN_CHAIN是一个匹配规则,旨在提供一种查找对象祖先的方法。许多使用 AD 的应用程序通常使用分层数据。

此类查询的一个示例是检查用户“user1”是否是组“group1”的成员。您可以将 base 设置为用户 DN (cn=user1, cn=users, dc=x) 并将范围设置为 base。

(memberof:1.2.840.113556.1.4.1941:=cn=Group1,OU=groupsOU,DC=x)

找到“user1”所属的所有组,将base设置为组容器DN;例如 (OU=groupsOU, dc=x) 和子树的范围。

(member:1.2.840.113556.1.4.1941:=cn=user1,cn=users,DC=x)

有关详细信息,请参阅此 document Ans and SO Thread