Аутентификация через LDAP

Меня интересует, как другие люди кодируют это, потому что я либо неправильно понимаю, либо что-то упускаю, или, может быть, даже я делаю это правильно!

Прежде всего, это НЕ экземпляр Active Directory LDAP, его OpenDS, что, кроме некоторых синтаксических различий, не должно иметь большого значения.

Итак, предположим, у меня есть настройки моей древовидной структуры примерно так:

-dc=somedomain,dc=com
-uid=rootuser
    -ou=Group1
       -uid=username1
       -uid=username2
    -ou=Group2
       -uid=username3
       -uid=username4

Чтобы аутентифицироваться как "rootuser", мне нужно будет передать полное имя пользователя при создании объекта System.DirectoryServices.DirectoryEntry, в этом случае:

UID =rootuser,dc=somedomain, DC = COM

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

UID =username1,dc=somedomain, DC = COM

но это будет работать

UID =username1,dc=somedomain, DC = ком, НУ =Group1

Поэтому мой вопрос заключается в том, как вы справляетесь с этим, когда во время входа в систему вы не знаете, к какой конкретной группе принадлежит пользователь, чтобы построить этот путь? Единственный способ сделать это - сделать первоначальный вызов "rootuser", чтобы у меня был доступ ко всему дереву, а затем использовать System.DirectoryServices.DirectorySearcher, чтобы отсканировать его для конкретного пользователя (то есть username1).

using (DirectorySearcher searcher = GetDirectorySearcher()) {
    searcher.Filter = "(&(objectClass=person)(uid=" + userName+ "))";
    SearchResult result = searcher.FindOne();
    return result.GetDirectoryEntry().Path;
}

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

Спасибо!

2 ответа

Решение

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

Вы не говорите, какой язык вы используете, но в JNDI это означает установку DN в качестве участника безопасности, пароля в качестве учетных данных и вызов LdapContext.reconnect().

SASL поддерживает идею использования имени пользователя для аутентификации. Ваш администратор сервера каталогов может настроить сервер каталогов для сопоставления отличительных имен с идентичностями. При правильном сопоставлении клиент может пройти аутентификацию, не зная отличительного имени. Серверы каталогов профессионального качества поддерживают ряд различных механизмов отображения, таких как direct mapping, exact match, regular expressionили пользовательский сопоставитель удостоверений.

Другие вопросы по тегам