Получение сведений о пользователе из каталога Active Directory LDAP из НЕСКОЛЬКИХ доменов с помощью Java.

Мое требование состоит в том, что на основе идентификатора пользователя мне нужно получить данные пользователя (например, имя и фамилию) из активного каталога LDAP. Но загвоздка здесь в том, что мы не знаем, в каком домене будет существовать пользователь. И у нас есть около 12 разных доменов, каждый из которых имеет разные URL-адреса провайдера. В настоящее время я могу получить данные о пользователе из одного домена, если я ввожу - 1. providerURL (это зависит от домена, каждый домен имеет свой URL) 2. имя пользователя 3. пароль

Поскольку проблема в том, что мы не знаем, в каком домене будет существовать пользователь, я не хочу делать последовательные или параллельные вызовы для поиска пользователя по одному в каждом домене. Есть ли другой способ, чтобы за один вызов я мог искать конкретного пользователя во всех доступных доменах? ищу любое простое решение на основе Java или Spring-Java.

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

Я не знаю о структуре сервера Active Directory LDAP, могу ли я иметь учетную запись службы (со специальными разрешениями на доступ к ролям), чтобы с ее помощью я мог искать сведения о пользователях во всех доменах.

Другой запрос -> вместо глобальной учетной записи службы. Если мы создадим учетную запись службы в одном домене с некоторыми дополнительными разрешениями на доступ к специальным ролям, могу ли я использовать ее для поиска пользователя из любых других доменов?

Пожалуйста, предложите подход к решению для требований нашего проекта.

В настоящее время я могу получить данные пользователя из одного домена, используя его, используя приведенный ниже код->

public class LDAPExaminer {

public static void main(String[] args) {
    LDAPExaminer ldapExaminer = new LDAPExaminer();

    ldapExaminer.printUserBasicAttributes("userId", ldapExaminer.getLdapContext());
}

public LdapContext getLdapContext() {
    LdapContext ctx = null;
    try {
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.SECURITY_AUTHENTICATION, "Simple");


        env.put(Context.SECURITY_PRINCIPAL, "user@domain");

        env.put(Context.SECURITY_CREDENTIALS, "password");

        env.put(Context.PROVIDER_URL, "ldap://example.domain.com");

        env.put(Context.REFERRAL, "follow");
        System.out.println("Attempting to Connect...");

        ctx = new InitialLdapContext(env, null);
        System.out.println("Connection Successful.");
    } catch (NamingException nex) {
        System.out.println("LDAP Connection: FAILED");
        nex.printStackTrace();
    }
    return ctx;
}

private void printUserBasicAttributes(String username, LdapContext ctx) {
    try {

        SearchControls constraints = new SearchControls();
        constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);

        String[] attrIDs = {"distinguishedName", "UN", "givenname", "mail", "telephonenumber", "canonicalName", "userAccountControl", "accountExpires"};
        constraints.setReturningAttributes(attrIDs);


        NamingEnumeration answer = ctx.search("DC=example,DC=domain,DC=com", "sAMAccountName=" + username, constraints);

        if (answer.hasMore()) {
            Attributes attrs = ((SearchResult) answer.next()).getAttributes();
            System.out.println(attrs.get("distinguishedName"));
            System.out.println(attrs.get("givenname"));
            System.out.println(attrs.get("sn"));
            System.out.println(attrs.get("mail"));
            System.out.println(attrs.get("telephonenumber"));
            System.out.println(attrs.get("canonicalName"));
            System.out.println(attrs.get("userAccountControl"));
            System.out.println(attrs.get("accountExpires"));
        } else {
            throw new Exception("Invalid User");
        }

    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

}


person Sudhan    schedule 25.07.2019    source источник
comment
Расскажите нам, что вы пробовали, и покажите журналы или результаты и прочтите: stackoverflow.com/help/how-to-ask   -  person jwilleke    schedule 25.07.2019


Ответы (1)


Глобальный каталог работает так же, как обычное соединение LDAP, но работает только с другого порта. Итак, вам просто нужно указать порт GC 3268:

env.put(Context.PROVIDER_URL, "ldap://example.domain.com:3268");

Вот и все.

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

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

Есть и другие предостережения, например, некоторые атрибуты AD не реплицируются в глобальный каталог. Например, атрибут accountExpires, который вы ищете, не реплицируется в GC. Если вы найдите атрибут на сайте Microsoft , вы увидите, что «В глобальном каталоге» установлено значение «Ложь».

person Gabriel Luci    schedule 25.07.2019
comment
уже пробовал с портом 3268, но не работает, чтобы получить из другого домена. Кажется, леса AD независимы в нашей организации. - person Sudhan; 25.07.2019
comment
Если они находятся в разных лесах, у вас нет другого выбора, кроме как запросить их по отдельности. - person Gabriel Luci; 25.07.2019