Как аутентифицировать пользователя из каталога LDAP с его именем пользователя и паролем?

Я новичок в LDAP API. Я могу подключиться к серверу LDAP и выполнить поиск пользователя. Как мне аутентифицировать пользователя с помощью имени пользователя и пароля с помощью LDAP API? Я не вижу никакого метода аутентификации на DirContext.
Для аутентификации пользователя Должен ли я:

  1. Передайте пароль пользователя как SECURITY_CREDENTIALS
  2. Установите соединение LDAP
  3. Искать данное имя пользователя

Означает ли это аутентификацию в LDAP?


person Himanshu Yadav    schedule 27.08.2012    source источник
comment
Является ли этот сервер LDAP контроллером домена Windows?   -  person Vikdor    schedule 27.08.2012
comment
Не уверен, так как это AD Клиента. Это имеет значение?   -  person Himanshu Yadav    schedule 27.08.2012
comment
Я сомневаюсь, что Windows AD будет настроена для простой аутентификации на основе пользователя / пароля. В основном он будет настроен на использование NTLMv1 или NTLMv2 (начиная с Windows 2007) или SPNEGO в корпоративной / производственной среде.   -  person Vikdor    schedule 27.08.2012
comment
Допустим, он настроен на аутентификацию.   -  person Himanshu Yadav    schedule 27.08.2012


Ответы (2)


Когда клиент подключается к серверу каталогов LDAP, состояние авторизации подключения устанавливается на anonymous. Клиенты LDAP используют запрос BIND для изменения состояния авторизации соединения. Каждый запрос BIND изменяет состояние авторизации соединения на anonymous, и каждый успешный запрос BIND изменяет состояние авторизации соединения на состояние авторизации, связанное с успешным запросом BIND, то есть состояние пользователя. Неудачные запросы BIND оставляют соединение в состоянии anonymous.

Клиент создает BindRequest (простой запрос BIND или форму запроса привязки SASL) передает серверу каталога LDAP и интерпретирует ответ сервера, включая любые элементы управления ответом, которые могут сопровождать ответ BIND. Нулевой код результата в ответе BIND указывает на то, что сервер каталогов LDAP соответствует учетным данным и пользователь аутентифицирован.

Если отличительное имя пользователя известно, то запрос BIND может быть построен на основе отличительного имени. Если это неизвестно, клиент LDAP должен создать поисковый запрос, передать его серверу и интерпретировать ответ. Отличительное имя всегда включается в успешный поисковый ответ, который возвращает хотя бы одну запись. Затем используйте выделенное, возвращенное в ответе на поиск, для создания запроса BIND, как указано выше.

В простейшем случае:

// exception handling is not shown
final String dn = ....;
final byte[] password = ....;
final BindRequest bindRequest = new SimpleBindRequest(dn,password);
final LDAPConnection ldapConnection = new LDAPConnection(hostname,port);
final BindResult bindResult = ldapConnection.bind(bindRequest);
final ResultCode resultCode = bindResult.getResultCode();
if(resultCode.equals(ResultCode.SUCCESS))
{
    // user is authenticated
}
ldapConnection.close();

Если вы используете Java, вам следует использовать UnboundID LDAP SDK (JNDI не должен быть используется для нового кода).

смотрите также

person Terry Gardner    schedule 27.08.2012
comment
Это может показаться глупым, поскольку я новичок в LDAP. Отличается ли вводимый пользователем пароль от SECURITY_CREDENTIALS сервера LDAP для установления соединения? - person Himanshu Yadav; 27.08.2012
comment
Вы возненавидите этот ответ: это зависит от обстоятельств. Также можно выполнить аутентификацию через прокси, для чего требуются учетные данные другого пользователя. - person Terry Gardner; 27.08.2012

Вы можете попробовать JAAS. Существует com.sun.security.auth.module.LdapLoginModule в JDK для этой цели. Я попробовал, и он отлично работает.

person gkuzmin    schedule 27.08.2012
comment
Я понимаю этот модуль JAAS, и это наше будущее требование. Для целей POC на данный момент я должен решить эту проблему. - person Himanshu Yadav; 27.08.2012
comment
В этом случае вам нужно будет использовать LDAP API и выполнить привязку, которая передает учетные данные для входа в LDAP и, по сути, возвращает истинное / ложное значение, которое аутентифицировал пользователь. После этого вы можете запросить информацию о пользователе. - person Chris Nava; 27.08.2012
comment
@ChrisNava Как передать имя пользователя / пароль для привязки пользователя? Как мне подключиться к серверу LDAP? Через введенный пользователем пароль или заранее заданный пароль? - person Himanshu Yadav; 27.08.2012
comment
Вы можете попробовать UnboundId LDAP SDK. Я тоже пробовал, он отлично работает. Он намного проще, чем JNDI, и поддерживает некоторые дополнительные интересные функции. - person gkuzmin; 28.08.2012
comment
Это будет зависеть от выбранного вами API. Как правило, вы передаете идентификатор пользователя и пароль методу привязки (считайте, что привязка (пользователь, пароль) - это то, что вы ожидаете от метода входа (пользователя, пароля)). Затем вы должны выполнить search () (или некоторые из них) для групп / ролей пользователей и использовать эту информацию для управления доступом. Все вышеперечисленное очень зависит от API и схемы базы данных LDAP. - person Chris Nava; 11.09.2012
comment
@Himanshu: Мне также нужно проверить имя пользователя и пароль на сервере LDAp после получения привязки от главного пользователя. но не нашел решения, есть ли у вас какое-либо решение, как мне действовать? - person Shardendu; 28.09.2017