Библиотека для работы с LDAPS?

Всего то нужно - обратиться к Active Directory и провалидировать логин-пароль пользователя. С LDAP всё работало, встала задача перейти на LDAPS - и тут началось. Первым делом по привычке спросил ИИ предоставить актуальный код. Быстро выяснилось, что и Novell.Directory.Ldap и LdapForNet с каждой версией сильно меняют синтаксис, подобрать код под версии библиотек, доступных мне через корпоративную копию NuGet для .NET8, ИИ не смог. Я, наверное, с десяток версий кода перепробовал, там какие-то ломающие изменения с каждой версией, я так и не понял, как мне проверить сертификат, например. Код не привожу, потому что его очень много и разного. В каждом коде ругается либо на то, что какое-то свойство отсутствует, либо какой-то класс. Может есть какое-то более-менее стабильное решение? Ну, либо ИИ меня вводит в заблуждение и всё гораздо проще?

В общем, если что, мне доступны:

  • Novell.Directory.Ldap.NETStandard 4.0.0
  • LdapForNet 2.7.15

Хотелось бы работающий пример проверки авторизации в LDAPS с дополнительной проверкой валидности сертификата.

Ну, либо посоветуйте другую библиотеку, более стабильную, без ломающих изменений.


Ответы (1 шт):

Автор решения: CrazyElf

В общем, разобрался с помощью коллег и частично таки ИИ. Основное было - угадать, как передать ссылку на коллбэк проверки сертификата при использовании библиотеки Novell.Directory.Ldap.NETStandard (в разных версиях библиотеки это делается совсем по-разному). В остальном код такой же, как был для LDAP, только порт коннекта поменялся на DefaultSslPort, ну и в опциях ещё включается SSL.

using Novell.Directory.Ldap;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Threading.Tasks;

// ...

public async Task<bool> LdapAuth(string ldapHost, string domain, string user, string password)
{
    string userWithDomain = $"{user}@{domain}";

    try
    {
        var ldapConnectionOptions = new LdapConnectionOptions();
        ldapConnectionOptions
            .ConfigureRemoteCertificateValidationCallback(ValidateServerCertificate)
            .UseSsl();

        using var connection = new LdapConnection(ldapConnectionOptions);
        await connection.ConnectAsync(ldapHost, LdapConnection.DefaultSslPort);
        await connection.BindAsync(userWithDomain, password);
        if (connection.Bound)
            return true;
    }
    catch (LdapException ex)
    {
        _logger.Error(ex, "Ошибка LDAP.");
    }
    catch (System.Exception ex)
    {
        _logger.Error(ex, "Неизвестная ошибка.");
    }

    return false;
}

private bool ValidateServerCertificate(
    object sender,
    X509Certificate certificate,
    X509Chain chain,
    SslPolicyErrors sslErrors)
{
    // ⚠️ В production — проверяйте сертификат строго по thumbprint или issuer
    _logger.Debug("SSL Certificate: " + certificate?.Subject);

    // Разрешаем только если ошибок нет
    return sslErrors == SslPolicyErrors.None;
}
→ Ссылка