Я пытаюсь использовать пространство имен .NET 3.5 System.DirectoryServices.AccountManagement
, чтобы проверять учетные данные пользователя на нашем сервере LDAP Active Directory через SSL-шифрованное соединение LDAP. Здесь пример кода:
using (var pc = new PrincipalContext(ContextType.Domain, "sd.example.com:389", "DC=sd,DC=example,DC=com", ContextOptions.Negotiate))
{
return pc.ValidateCredentials(_username, _password);
}
Этот код отлично работает над незащищенным LDAP (порт 389), однако я бы предпочел не передавать комбинацию пользователя/пароля в виде открытого текста. Но когда я перехожу на LDAP + SSL (порт 636), я получаю следующее исключение:
System.DirectoryServices.Protocols.DirectoryOperationException: The server cannot handle directory requests.
at System.DirectoryServices.Protocols.ErrorChecking.CheckAndSetLdapError(Int32 error)
at System.DirectoryServices.Protocols.LdapSessionOptions.FastConcurrentBind()
at System.DirectoryServices.AccountManagement.CredentialValidator.BindLdap(NetworkCredential creds, ContextOptions contextOptions)
at System.DirectoryServices.AccountManagement.CredentialValidator.Validate(String userName, String password)
at System.DirectoryServices.AccountManagement.PrincipalContext.ValidateCredentials(String userName, String password)
at (my code)
Порт 636 работает для других действий, таких как поиск информации без пароля для этой записи LDAP/AD...
UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, _username)
... поэтому я знаю, что это не моя настройка SSL-сервера LDAP, поскольку она работает через SSL для других поисков.
Кто-нибудь получил вызов ValidateCredentials(...)
для работы через SSL? Можете ли вы объяснить, как это сделать? Или есть другой/лучший способ надежной проверки учетных данных AD/LDAP?