Подтвердить что ты не робот

Java, LDAP: не игнорировать пустые пароли?

Я поддерживаю некоторый устаревший код Java LDAP. Я почти ничего не знаю о LDAP.

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

Все работает хорошо, если задан неверный пароль. Исключено исключение "недопустимые учетные данные". Однако, если пустой пароль отправлен на сервер LDAP, аутентификация все равно будет выполняться, атрибуты LDAP будут по-прежнему возвращаться.

Является ли эта неприятная ситуация из-за того, что сервер LDAP допускает использование пустых паролей, или нужно изменить код ниже, так что пустой пароль будет загружаться на сервер LDAP таким образом, чтобы он был отклонен?

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

Большое спасибо за любую информацию

import javax.naming.*;
import javax.naming.directory.*;
import java.util.*;
import java.sql.*;

public class LDAPTEST {

    public static void main(String args[]) {

        String lcf                = "com.sun.jndi.ldap.LdapCtxFactory";
        String ldapurl            = "ldaps://ldap-cit.smew.acme.com:636/o=acme.com";
        String loginid            = "George.Jetson";
        String password           = "";
        DirContext ctx            = null;
        Hashtable env             = new Hashtable();
        Attributes attr           = null;
        Attributes resultsAttrs   = null;
        SearchResult result       = null;
        NamingEnumeration results = null;
        int iResults              = 0;
        int iAttributes           = 0;


        env.put(Context.INITIAL_CONTEXT_FACTORY, lcf);
        env.put(Context.PROVIDER_URL, ldapurl);
        env.put(Context.SECURITY_PROTOCOL, "ssl");
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, "uid=" + loginid + ",ou=People,o=acme.com");
        env.put(Context.SECURITY_CREDENTIALS, password);
        try {

            ctx     = new InitialDirContext(env);
            attr    = new BasicAttributes(true);
            attr.put(new BasicAttribute("uid",loginid));
            results = ctx.search("ou=People",attr);

            while (results.hasMore()) {
                result       = (SearchResult)results.next();
                resultsAttrs = result.getAttributes();

                for (NamingEnumeration enumAttributes  = resultsAttrs.getAll(); enumAttributes.hasMore();) {
                    Attribute a = (Attribute)enumAttributes.next();
                    System.out.println("attribute: " + a.getID() + " : " + a.get().toString());
                    iAttributes++;


                }// end for loop

                iResults++;
            }// end while loop

            System.out.println("Records  == " + iResults + " Attributes: " + iAttributes);

        }// end try
        catch (Exception e) {
            e.printStackTrace();
        }



    }// end function main()
}// end class LDAPTEST
4b9b3361

Ответ 1

К сожалению, аутентификация с DN и пустым паролем является одной из трудностей LDAP и приводит к "неаутентифицированному" положительному отклику сервера. Некоторые LDAP-серверы имеют параметры конфигурации, чтобы отключить это поведение, которое было обескуражено в последней версии LDAPv3 (RFC 4511), и даже отключили его по умолчанию.

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

С уважением,

Лодовико

Ответ 2

Вам нужно изменить метод аутентификации из простого (что не, что-то использовать в рабочей среде, по крайней мере, не без SSL).

Как указано здесь: http://docs.oracle.com/javase/jndi/tutorial/ldap/security/simple.html

Если вы поставляете пустую строку, пустой массив байтов / char или null в свойство среды Context.SECURITY_CREDENTIALS, тогда механизм аутентификации будет "none". Это связано с тем, что LDAP требует, чтобы пароль был непустым для простой аутентификации. Протокол автоматически преобразует аутентификацию в "none", если пароль не указан.

Ответ 3

Существует два типа операций BIND: simple и SASL. В случае простого BIND существует четыре возможности:

  • пустой DN и пустой пароль: anonymous, аутентификация не выполняется. Это начальное состояние, а также состояние, когда сервер получает запрос BIND.
  • непустой DN, пустой пароль: unauthenticated, аутентификация не выполняется
  • непустой DN, непустой пароль: обычный случай, попытка аутентификации
  • пустое DN, непустой пароль: поведение сервера не определено в стандартах LDAP. Аутентификация не выполняется.

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

Семантика BIND определена в LDAP: Аутентификация

Ответ 4

Что происходит, когда вы отправляете "пустой" пароль, аутентификация (т.е. привязка) выполняется как анонимная.

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

Некоторые LDAP-реализации могут останавливать любые анонимные привязки.