Я пытаюсь использовать пространство имен .NET 3.5 System.DirectoryServices.AccountManagement
для проверки учетных данных пользователя на нашем сервере Active Directory LDAP через 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?