Поиск LDAP работает через ldapsearch через VPN, но не работает в C# (System.DirectoryServices.Protocols) — проблема с поC#

Место общения программистов C#
Ответить
Anonymous
 Поиск LDAP работает через ldapsearch через VPN, но не работает в C# (System.DirectoryServices.Protocols) — проблема с по

Сообщение Anonymous »

Я устраняю проблему с подключением LDAP на компьютере, подключенном через VPN.
Позвольте мне представить некоторый контекст, над которым я работаю:
  • Моя среда — это удаленный компьютер, подключенный через VPN, и ожидается, что сценарий будет запущен на других удаленных компьютерах.
  • Сервер LDAP доступен удаленно через VPN на 389 порт.
  • Этот сценарий, хотя и работает на .NET, должен быть независимым от ОС и работает на .NET 10+.
Используя этот CLI ldapsearch с той же машины, я могу успешно запросить сервер LDAP:

Код: Выделить всё

ldapsearch -x -H ldap://:389 -D "myDomain\MYUSER" -w MyPassword -b "baseDN" -LLL "(sAMAccountName=MYUSER)"
Это возвращает результаты правильно (он подключает и выбирает пользователей, как и ожидалось).
Проблема заключается в том, что я пытаюсь реализовать те же параметры соединения для подключения к этой службе LDAP через System.DirectoryServices.Protocols. Я думаю, что тот же запрос не работает:

Код: Выделить всё

static LdapConnection OpenManualConnection(string ldapUri, NetworkCredential creds, string bindDn, string baseDn)
{
var uri = new Uri(ldapUri);
var port = 389;

var addresses = Dns.GetHostAddresses(uri.Host)
.Where(a => a.AddressFamily == AddressFamily.InterNetwork)
.ToArray();

var ldapId = new LdapDirectoryIdentifier(addresses[0].ToString(), port);

Console.WriteLine($"Using manual LDAP connection settings: {ldapUri}:{port}, base DN: {baseDn}");

var connection = new LdapConnection(ldapId, creds, AuthType.Basic)
{
SessionOptions =
{
ProtocolVersion = 3,
SendTimeout = TimeSpan.FromSeconds(60)
}
};

Console.WriteLine("Attempting LDAP bind with user: " + bindDn);

var bindTask = Task.Run(connection.Bind);
if (!bindTask.Wait(TimeSpan.FromSeconds(60)))
{
connection.Dispose();
throw new TimeoutException("LDAP bind timed out after 60 seconds. The server may be unreachable.");
}

try
{
bindTask.GetAwaiter().GetResult();
}
catch (LdapException ldapEx)
{
connection.Dispose();
// Mirror ldapsearch exit-code meanings for actionable messages
throw new LdapException(ldapEx.ErrorCode, $"LDAP bind failed (code {ldapEx.ErrorCode}): {ldapEx.Message}{hint}");
}

return connection;
}
Хотя при отладке все параметры точно такие же, как в ldapsearch, и фактически код показывает это сообщение. Использование ручных настроек соединения LDAP: ... в целях тестирования код останавливается при создании нового LdapConnection. Я пытался принудительно разрешить IPv4, чтобы код проходил через туннель, но безуспешно.
При обнаружении ошибок на консоли появляется следующая ошибка:

ОШИБКА: запрос Active Directory не выполнен. Сервер LDAP недоступен.

Кроме того, я пробовал использовать другой AuthType, но тоже безуспешно.
Почему ldapsearch работает успешно, а System.DirectoryServices.Protocols не работает на той же машине? Существуют ли различия в механизмах аутентификации (простое связывание и согласование/NTLM/Kerberos) или обработке TLS/StartTLS, погоне за ссылками или таймаутах?
Какая конфигурация требуется в C# для соответствия поведению ldapsearch?
Буду признателен за любую информацию о различиях между клиентами ldapsearch и .NET LDAP.
Я вроде как потерялся, так как для меня это в новинку, и я немного изучил документацию, но безуспешно.
Заранее спасибо
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»