建立
ldapConnection
后,我想检查给定用户是否是按名称指定的组的成员(注意:我的意思是“用户友好”名称,而不是 DN)。
我第一次尝试 LDAP 过滤器语法并发现了一些可行的方法,但它需要我进行两次调用:
正如我所说,这很好用,但我想知道是否可以改进。特别是:也许可以使用单个查询来解决问题。
我的代码的正在进行的版本如下。它绝对还没有准备好投入生产,但展示了大局。
最后一件事:当谈到
userStore
价值时,我通过尝试和失败(大部分是失败)找到了它。我发现的价值似乎有效,但如果有更好的东西,请告诉我。
using var ldapConnection = new LdapConnection(new LdapDirectoryIdentifier(myServer, myPort));
var networkCreds = new NetworkCredential(myUserName, myPassword, myDomain);
ldapConnection.Bind(networkCreds);
var userStore = $"DC=domain,DC=local";
var groupSearchFilter = $"(sAMAccountName={myGroupName})";
var groupSearchRequest = new SearchRequest
(userStore, groupSearchFilter, System.DirectoryServices.Protocols.SearchScope.Subtree, new string[] { "DistinguishedName" });
var groupDN = ((SearchResponse)ldapConnection.SendRequest(groupSearchRequest)).Entries[0];
var searchFilter = $"(&(sAMAccountName={myUserName})(memberof={groupDN.DistinguishedName}))";
var searchRequest = new SearchRequest
(userStore, searchFilter, System.DirectoryServices.Protocols.SearchScope.Subtree, new string[] { "DistinguishedName" });
var response = (SearchResponse)ldapConnection.SendRequest(searchRequest);
return (response.Entries.Count > 0);
在典型的 LDAP 服务器中,例如您似乎正在使用的 Active Directory,组成员身份被存储,以便“组有成员”(
member
属性)。会员资格反映在用户中(memberOf
属性)。
但是成员资格是使用专有名称存储的。因此,要测试会员资格,您必须:
dn
属性dn
是否在该组的(多值)member
属性中您已经获得了该组的 DN,但其
sAMAccountName
属性是唯一的且已建立索引,请按原样使用。更改该代码以使用此过滤器搜索用户的 DN:
var userSearchFilter = $"(sAMAccountName={myUserName})";
从中提取用户的
dn
中的 userDN
(例如)。然后使用此 LDAP 搜索验证成员资格:
var searchFilter = $"(&(objectClass=group)(sAMAccountName={myGroupName})(member={userDN.DistinguishedName}))";
这里我将
objectClass
添加到搜索中。这不是必需的,但如果您有大量用户和很少的组,它可以加快搜索速度。为了对称,您可以在搜索用户时添加 (objectClass=group)
。