Как перевести доменное имя в LDAP DC при работе в лесу Active Directory в Java? - PullRequest
2 голосов
/ 29 июня 2011

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

Я нахожусь в огромном лесу AD с> 20 поддоменами, реплицирующимися на несколько сотен серверов.Скажем, основной домен и область Kerberos COMPANY.COM, а я работаю в D1.COMPANY.COM.Я подключаюсь из Java к глобальному каталогу и могу получить доступ ко всему forrest для поддержки всех пользователей компании.

URL-адрес моего подключения выглядит следующим образом: ldap://mycompany.com:3268/DC=company,DC=com

Весь материал работаетв веб-приложении с использованием SPNEGO для аутентификации пользователей, что работает очень хорошо.Т.е. после успешного входа в систему я получаю пользователей UPN / Kerberos.По некоторым причинам все поля UPN в лесу были изменены в соответствии с адресом электронной почты пользователя, а значение UPN осталось без изменений.Это означает, что я не могу выполнить поиск по принцу krb, но мне нужно удалить имя пользователя и выполнить поиск по sAMAccountName.Я предположил, что sAMAccountName является уникальным во всем лесу, пока пользователь не смог войти в систему вчера.После некоторой магии запроса LDAP я выяснил, что у двух пользователей одинаковые sAMAccountName в двух разных доменах.Мой поиск не удался.

Итак, вопрос в том, как мне определить базовое DN / DC области / поддомена, основанной на области Kerberos?

Я разобрался с несколькими подходами с раздетымстрока области:

  1. составляет URL-адрес LDAP, подключается и читает defaultNamingContext
  2. , переформатирует имя домена в DC = d1, DC ...

В настоящее времяЯ использую подход 2, который кажется самым простым.Хотя некоторые сообщения C # о переполнении стека говорят, что это может произойти из-за непересекающихся пробелов.

Кто-нибудь знает о безопасном решении?На самом деле лучше всего было бы перевести принципалы Kerberos в имена пользователей.

Ответы [ 2 ]

1 голос
/ 29 июня 2011

После входа в систему вы получаете UPN, который является электронной почтой. Часть имени пользователя этого может использоваться, потому что это не уникально. Доменная часть не может использоваться, потому что она должна совпадать с контекстом именования. У вас может быть dc = mydomain, dc = com, но домен для электронной почты может быть похож на myemaildomain.com. И я могу добавить это как дополнительную UPN, я думаю, это то, что произошло в вашем случае.

Не используйте второй подход. Возьми первый. Выполните поиск DNS srv _ldap._tcp.domain.com Прочтите о DnsQueryConfig, чтобы получить настроенное доменное имя Получить имя сервера. выполните поиск в rootDse, запрашивая namingContext. и построить ldapurls

Далее .., похоже, что emailid в вашем домене уникален по всему лесу (?) Если это так, возможно, вы можете пометить идентификатор электронной почты как атрибут PAS, чтобы у каждого GC была его копия, и выполнить поиск ldap на порте GC для emailid. Но это очень плохой вариант, так как для этого требуются изменения схемы с более чем 20 поддоменами.

0 голосов
/ 18 июня 2012

Kaylan, проект oVirt (www.ovirt.org) содержит код Spring-Ldap, который показывает вам, как проходить аутентификацию с Kerberos в Active-Directory, RHDS, ipa и Tivoli-DS. Нам все еще нужно продолжить и реализовать функциональность леса (для этого просто задали вопрос о реализации CLdap в Java). Чтобы получить defaultNamingContext, вам нужно будет выполнить запрос RootDSE (у нас есть код для этого также в oVirt) к нужному домену. Вы можете скачать исходники, выполнив git clone, или просмотреть их, используя http://gerrit.ovirt.org

Посмотрите на код в engine \ backend \ manager \ modules \ bll \ src \ main \ java \ org \ ovirt \ engine \ core \ bll \ adbroker

Вы увидите там все, что вам нужно для этого.

...