Использование C # для аутентификации пользователя с помощью LDAP

18

Я использую DirectorySearcher для поиска пользовательской записи на сервере LDAP.

DirectoryEntry de = new DirectoryEntry();
de.Path = "LDAP://myserver/OU=People,O=mycompany";
de.AuthenticationType = AuthenticationTypes.None;

DirectorySearcher deSearch = new DirectorySearcher();

deSearch.SearchRoot = de;
deSearch.Filter = "(uid=" + model.UserName + ")";

SearchResult result = deSearch.FindOne();

Я могу получить требуемый вывод в переменной результата.
Однако, если я пытаюсь выполнить аутентификацию одного и того же пользователя, указав пароль в записи каталога, я всегда получаю следующую ошибку.

«Имя пользователя или пароль неверны».

DirectoryEntry entry = new DirectoryEntry("LDAP://myserver/OU=People,O=mycompany", username, password);
DirectorySearcher search = new DirectorySearcher(
    entry,
    "(uid=" + username + ")",
    new string[] { "uid" }
);

search.SearchScope = System.DirectoryServices.SearchScope.Subtree;
SearchResult found = search.FindOne();   ->>>>>this is where I get wrong credential error.

Имя пользователя и пароль для пользователя, которого я хочу проверить.

Может кто-нибудь сказать мне, что я делаю неправильно здесь или как отлаживать это.

    
задан sunny days 19.07.2012 в 15:16
источник
  • Требуется ли сервер LDAP для аутентификации перед его запросом? –  T. Fabre 19.07.2012 в 15:19
  • нет, он не требует аутентификации для поиска. Я могу искать как анонимный пользователь. У меня есть веб-инструмент, где мне нужно реализовать LDAP-аутентификацию, чтобы доступ к ней имели только аутентичные пользователи. –  sunny days 19.07.2012 в 16:02

1 ответ

32

Это имя пользователя и пароль в этой строке:

DirectoryEntry("LDAP://myserver/OU=People,O=mycompany", username, password);

должен быть для учетной записи, которая имеет разрешение на поиск каталога. Это может быть служебная учетная запись или цель тестирования с вашим собственным. Это не должно быть пользователем / проходом того, кого вы пытаетесь аутентифицировать.

Если вы хотите выполнить аутентификацию, вы можете использовать следующие шаги, используя PrincipalContext:

using(var context = new PrincipalContext(ContextType.Domain, "mydomain", "mydomain\serviceAcct", "serviceAcctPass")) {
 //Username and password for authentication.
 return context.ValidateCredentials(username, password); 
}

"serviceAcct" = учетная запись пользователя домена, у которой есть разрешение на поиск каталога. «serviceAcctPass» = пароль для этой учетной записи службы. Как я уже сказал, для тестирования вы можете попробовать свой собственный контекст пользователя / пароля.

Кроме того, убедитесь, что предоставленное имя пользователя имеет либо форматирование домена «имя пользователя», либо «имя пользователя @ домена».

    
ответ дан loopedcode 19.07.2012 в 15:27
  • ОК, так что я здесь предлагаю неправильно. Не могли бы вы рассказать мне, что нужно сделать, чтобы аутентифицировать любого обычного пользователя с помощью LDAP, указав его имя пользователя и пароль? или перенаправить меня в какой-то учебник или ссылку. Спасибо –  sunny days 19.07.2012 в 16:01
  • Проверить обновленный ответ. –  loopedcode 19.07.2012 в 16:14
  • Чтение из другого комментария, который вы опубликовали выше, кажется, ваш домен не требует аутентифицированного пользователя для поиска. Если это так, вы, вероятно, можете использовать конструктор по умолчанию для PrincipalContext вместо конструктора user / pass. –  loopedcode 19.07.2012 в 16:25
  • как использовать directoryEntry и principlacontext вместе? bcz, если я пытаюсь использовать Ldap в maincontext, он приносит ошибку, которую он не может подключиться к системе –  Salman 25.02.2015 в 14:04
  • @Salman System.DirectoryServices.AccountManagement –  Zakos 20.10.2015 в 11:34