PrincipalContext.ValidateCredentials завершается с ошибкой "Сервер не может обрабатывать запросы каталогов".

У меня есть приложение, в котором пользователь проходит аутентификацию в нашей Active Directory:

private bool Authenticate()
{
     using (var context = new PrincipalContext(ContextType.Domain, Environment.UserDomainName)) 
     {
         return context.ValidateCredentials(this.Username.Text.Trim(), this.Password.Text.Trim());
     }
}

Он работал хорошо в течение нескольких лет. Теперь наши машины с Windows 7 заменяются на Windows 10, и некоторые пользователи получают эту ошибку:

Сервер не может обрабатывать запросы каталогов.

в System.DirectoryServices.Protocols.ErrorChecking.CheckAndSetLdapError(ошибка Int32)
в System.DirectoryServices.Protocols.LdapSessionOptions.FastConcurrentBind()
в System.DirectoryServices.AccountManagement.CredentialValidator.BindLdap(NetworkCredential creds, ContextOptions contextOptions)
в System.DirectoryServices.AccountManagement.CredentialValidator.Validate(String userName, String password)
в System.DirectoryServices.AccountManagement.PrincipalContext.ValidateCredentials(String userName, String password)
в DPI.FormLogin.Authenticate() в c:\Developing\Source\DPI\Client\DPI\FormLogin.cs: строка 280

Ошибка появляется только для некоторых пользователей, а не постоянно. Возможно, это связано с настройками безопасности, которые теперь стали более строгими на Win 10, чем на Win 7 раньше.

Есть идеи как это решить? Как я могу опросить подключенный в данный момент сервер LDAP? Возможно, наши серверы настроены немного иначе, и проблема ограничена только одним сервером, который может быть неправильно настроен.

1 ответ

Решение

Да добавление ContextOptions.Negotiate решил проблему:

private bool Authenticate()
{
     using (var context = new PrincipalContext(ContextType.Domain, Environment.UserDomainName)) 
     {
         return context.ValidateCredentials(this.Username.Text, this.Password.Text, ContextOptions.Negotiate);
     }
}
Другие вопросы по тегам