我搜索的C#LDAP / AD服务器的最简单(但仍在工作)示例并没有取得多大成功。存在许多库来连接到LDAP服务器, 但不连接到LDAP服务器本身(在C#上) 。
但是,我发现了一些有关它的信息,甚至发现了一个请求简单的LDAP服务器的帖子,都回答了“ LDAP isn't simple”;但是我在GitHub Flexinet LDAP Server上阅读了很多RFC4511和此示例代码,但是不幸的是,我还不知道要完成其代码。
我的目标是不要使成为一台功能齐全的LDAP服务器,但至少可以做到:
更新
我正在尝试实施Flexinet示例并适应该功能;作为问题的形式,当我调用该函数时,应怎么做才能更改此函数以防止其引起异常(在“ var filter = searchRequest.ChildAttributes [6] ;”行总是会中断)通过LDAP客户端软件:
private void HandleSearchRequest(NetworkStream stream, LdapPacket requestPacket)
{
var searchRequest = requestPacket.ChildAttributes.SingleOrDefault(o => o.LdapOperation == LdapOperation.SearchRequest);
var filter = searchRequest.ChildAttributes[6];
if ((LdapFilterChoice)filter.ContextType == LdapFilterChoice.equalityMatch && filter.ChildAttributes[0].GetValue<String>() == "sAMAccountName" && filter.ChildAttributes[1].GetValue<String>() == "testuser") // equalityMatch
{
var responseEntryPacket = new LdapPacket(requestPacket.MessageId);
var searchResultEntry = new LdapAttribute(LdapOperation.SearchResultEntry);
searchResultEntry.ChildAttributes.Add(new LdapAttribute(UniversalDataType.OctetString, "cn=testuser,cn=Users,dc=dev,dc=company,dc=com"));
searchResultEntry.ChildAttributes.Add(new LdapAttribute(UniversalDataType.Sequence));
responseEntryPacket.ChildAttributes.Add(searchResultEntry);
var responsEntryBytes = responseEntryPacket.GetBytes();
stream.Write(responsEntryBytes, 0, responsEntryBytes.Length);
}
var responseDonePacket = new LdapPacket(requestPacket.MessageId);
responseDonePacket.ChildAttributes.Add(new LdapResultAttribute(LdapOperation.SearchResultDone, LdapResult.success));
var responseDoneBytes = responseDonePacket.GetBytes();
stream.Write(responseDoneBytes, 0, responseDoneBytes.Length);
}
代码在github链接上。
答案 0 :(得分:0)
我在RFC4511上找到了有关搜索工作原理的解释……并且我不太了解这种理解-我发现在GitHub from Flexinet LDAP Server上实现的方法只能回答绑定和搜索一个用户的请求(因为这只是示例实现)。
客户端在发出搜索请求之前,请求进行不同的调用以验证功能,结构和其他信息。因此,我将一一实现。
不过,如果存在任何其他lib(在C#中),并且有人知道,那比写一个破洞的新服务器要好。如果我的实现可行,我将其存储在github上并共享。
答案 1 :(得分:0)
最后,我在@Sammuel-Miranda/LdapServerLib上制作了 Flexinet LDAP服务器的分支,并在作者的支持下以及做出的一些更改和改编完成了该实现。它可以响应绑定和搜索呼叫,非常适合 Outlook 和 Thunderbird 用作共享地址簿。
但是我没有实现任何 ADD / MODIFY / DELETE 请求(但并不难),因为我不需要。