2010-10-26 2 views
2

Я работаю с довольно старым, большим CMS (TeamSite), и у него есть пример, как подключить его к LDAP-серверу. Я прочитал пример, и он работает очень странно. Он просто хранит пароль в поле «userPassword», как ожидалось, но он выполняет проверку вручную вместо использования команды bind.Использование String.equals сравнить пароль и аутентифицировать пользователя на сервере LDAP, имеет ли смысл?

Это не имеет смысла для меня, но я могу ошибаться, поскольку раньше я не работал с серверами LDAP. У вас есть идея, почему кто-то хочет вручную сравнить пароль вместо использования bind?

Вот как выглядит код:

Attribute attrPassword = attrs.get("userPassword"); 
    if (attrPassword.size() > 0) 
    { 
    String storedPassword = new String((byte[])attrPassword.get(0)); 

    if (password.equals(storedPassword)) 
    { 
     ///..... 

ответ

6

Это не имеет смысла для меня тоже. Пароль в LDAP не должен быть фактическим паролем, это должен быть хэш пароля. Если вы извлекаете поле и выполняете сравнение, вам нужно знать, какой хэш он использует и хеширует пароль, который вы сравниваете самим тем же способом. Это также требует, чтобы атрибут userPassword в LDAP был доступен для извлечения, что не должно быть необходимым. Я не думаю.

Короче говоря, нет ... Я думаю, вы должны использовать bind.

+0

Прикомандированный. Я хотел бы добавить, что некоторые реализации LDAP не позволяют читать доступ к 'userPassword', но позволяют вам использовать его в запросах. –

+0

Это объясняет, почему я видел пароль, сохраненный в поле «комментарий» в другом примере :) –

+0

Что касается пароля обычного текста. Я нашел где-то в комментариях, что JavaScript делает SHA1 дайджест из пароля перед отправкой формы. –

2

LDAP поддерживает сравнение по паролям, но в обратном направлении от того, как делает ваш код.

Как правило, клиент пытается сравнить, предоставляет пароль, сервер LDAP выполняет сравнение и возвращает true или false.

Ваш код выглядит так, будто он пытается прочитать пароль из LDAP, а затем сравнить его пространство процесса.

Это кажется маловероятным для работы с большинством любых серверов LDAP, если только не известен метод хеширования, а значение storedPassword предварительно превзошло.

Вы можете рассмотреть bind vs compare, если хотите (или не хотите) регистрационного события. Событие входа может быть полезно для отслеживания активности аккаунта. (Например, для обеспечения соответствия PCI вы хотите, чтобы люди не деактивировались из-за бездействия, которые определялись бы логинами).

+0

Не могли бы вы объяснить, как сделать сравнение паролей на сервере? Если я попытаюсь сравнить фактическую строку пароля с тем, что находится в поле userPassword, он возвращает false; чтобы заставить его возвращать true, насколько я могу судить, мне нужно передать ему всю строку «{ssha} stuff/otherstuff», которая требует, чтобы хеширование/кодирование выполнялось клиентом. – Avril

Смежные вопросы