Я безуспешно искал простейший (и тем не менее работающий) пример LDAP / AD Server для C #. Существует множество библиотек для подключения к серверам LDAP, но не к самому серверу LDAP (на C #) .

Однако я нашел некоторую информацию об этом и даже сообщение с запросом простого сервера LDAP, на которое был дан ответ "LDAP не простой" ; и все же я много читал RFC4511 и этот пример кода на GitHub Flexinet LDAP Server, но, к сожалению, у меня еще нет знаний, чтобы завершить его код.

Моя цель - не сделать полностью функциональный LDAP-сервер, а сделать так, чтобы он, по крайней мере, мог:

  1. Служит пулом входа в систему для программного обеспечения, которое позволяет пользователям регистрироваться и входить на сервер AD / LDAP (просто проверьте имя пользователя и пароль для аутентификации).
  2. Разрешите программам, таким как Outlook и Thunderbird, получать список пользователей (без паролей) с именем и фамилией, адресом электронной почты, номером телефона и отделом для модели списка контактов.
  3. Не требуется удалять, добавлять (или создавать), перемещать и другие функции, поскольку основное программное обеспечение, с которым я стремлюсь интегрировать, будет выполнять все функции управления пользователями и группами.

< Сильный > UPDATE

Я пытаюсь реализовать образец 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.

1
SammuelMiranda 20 Сен 2018 в 22:42

2 ответа

Лучший ответ

Наконец, я сделал форк Flexinet LDAP Server на @ Sammuel-Miranda / LdapServerLib и при поддержке автора и некоторых изменениях и адаптациях я завершил эту реализацию. Он отвечает на вызовы привязки и поиска и отлично работает с Outlook и Thunderbird для использования в качестве общей адресной книги.

Однако я не выполнял никаких запросов ДОБАВИТЬ / ИЗМЕНИТЬ / УДАЛИТЬ (но это было бы несложно), так как они мне не нужны.

1
SammuelMiranda 15 Авг 2019 в 19:56

Я нашел в RFC4511 объяснение того, как работает поиск ... и я "вроде" понимаю это, не очень хорошо - и я вижу, что метод реализован на GitHub с сервера LDAP Flexinet отвечает только на привязку и поисковые запросы одного пользователя (поскольку это только пример реализации).

Клиент запрашивает разные вызовы для проверки возможностей, структуры и другой информации, прежде чем делать сам поисковый запрос. Так что я буду реализовывать все это по одному.

Тем не менее, если существует какая-либо другая библиотека (на C #) и о ней кто-нибудь знает, это было бы лучше, чем писать новый сервер дыры. Если моя реализация сработает, я выложу ее на github и поделюсь.

0
SammuelMiranda 21 Сен 2018 в 13:12