Аутентификация через 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
или пользовательский сопоставитель удостоверений.