使用 C# 检查组成员身份的 LDAP 查询

问题描述 投票:0回答:1

建立

ldapConnection
后,我想检查给定用户是否是按名称指定的组的成员(注意:我的意思是“用户友好”名称,而不是 DN)。

我第一次尝试 LDAP 过滤器语法并发现了一些可行的方法,但它需要我进行两次调用:

  • 第一个获取我组的 DN,
  • 另一个检查用户是否是该组的成员(由其 DN 给出)。

正如我所说,这很好用,但我想知道是否可以改进。特别是:也许可以使用单个查询来解决问题。

我的代码的正在进行的版本如下。它绝对还没有准备好投入生产,但展示了大局。

最后一件事:当谈到

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);
c# ldap ldap-query group-membership
1个回答
0
投票

在典型的 LDAP 服务器中,例如您似乎正在使用的 Active Directory,组成员身份被存储,以便“组有成员”(

member
属性)。会员资格反映在用户中(
memberOf
属性)。

但是成员资格是使用专有名称存储的。因此,要测试会员资格,您必须:

  1. 找到您用户的
    dn
    属性
  2. 查看
    dn
    是否在该组的(多值)
    member
    属性中

您已经获得了该组的 DN,但其

sAMAccountName
属性是唯一的且已建立索引,请按原样使用。更改该代码以使用此过滤器搜索用户的 DN:

var userSearchFilter = $"(sAMAccountName={myUserName})";

从中提取用户的

dn
中的
userDN
(例如)。然后使用此 LDAP 搜索验证成员资格:

var searchFilter = $"(&(objectClass=group)(sAMAccountName={myGroupName})(member={userDN.DistinguishedName}))";

这里我将

objectClass
添加到搜索中。这不是必需的,但如果您有大量用户和很少的组,它可以加快搜索速度。为了对称,您可以在搜索用户时添加
(objectClass=group)

© www.soinside.com 2019 - 2024. All rights reserved.