Библиотека для работы с LDAPS?
Всего то нужно - обратиться к Active Directory
и провалидировать логин-пароль пользователя. С LDAP
всё работало, встала задача перейти на LDAPS
- и тут началось. Первым делом по привычке спросил ИИ предоставить актуальный код. Быстро выяснилось, что и Novell.Directory.Ldap
и LdapForNet
с каждой версией сильно меняют синтаксис, подобрать код под версии библиотек, доступных мне через корпоративную копию NuGet для .NET8, ИИ не смог. Я, наверное, с десяток версий кода перепробовал, там какие-то ломающие изменения с каждой версией, я так и не понял, как мне проверить сертификат, например. Код не привожу, потому что его очень много и разного. В каждом коде ругается либо на то, что какое-то свойство отсутствует, либо какой-то класс. Может есть какое-то более-менее стабильное решение? Ну, либо ИИ меня вводит в заблуждение и всё гораздо проще?
В общем, если что, мне доступны:
- Novell.Directory.Ldap.NETStandard 4.0.0
- LdapForNet 2.7.15
Хотелось бы работающий пример проверки авторизации в LDAPS
с дополнительной проверкой валидности сертификата.
Ну, либо посоветуйте другую библиотеку, более стабильную, без ломающих изменений.
Ответы (1 шт):
В общем, разобрался с помощью коллег и частично таки ИИ. Основное было - угадать, как передать ссылку на коллбэк проверки сертификата при использовании библиотеки 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;
}