Подключение/привязка к Active Directory (Windows) с использованием LDAP в Symfony 3 без использования строки dn

Я пытаюсь аутентифицировать пользователей в моей компании для приложений Symfony3 с помощью Active Directory. Моя текущая конфигурация выглядит следующим образом (это также было успешно протестировано на онлайн-тестовом сервере LDAP, поэтому я могу подтвердить правильность конфигурации Symfony).

//services.yml

Symfony\Component\Ldap\Ldap:
        arguments: ['@Symfony\Component\Ldap\Adapter\ExtLdap\Adapter']
    Symfony\Component\Ldap\Adapter\ExtLdap\Adapter:
        arguments:
            -   host: host.dom1.dom2.net
                port: 389
                encryption: none
                options:
                    protocol_version: 3
                    referrals: false
//security.yml

my_ldap:
      ldap:
         service: Symfony\Component\Ldap\Ldap
         base_dn: dc=dom1,dc=dom2,dc=net
         search_dn: "cn=myUsername,dc=dom1,dc=dom2,dc=net"
         search_password: myPassword
         default_roles: ROLE_ADMIN
         uid_key: sAMAccountName

....
firewalls:
      form_login_ldap:
         provider: my_ldap
         service: Symfony\Component\Ldap\Ldap
         dn_string: 'sAMAccountName={username},dc=dom1,dc=dom2,dc=net'
         login_path: login
         check_path: login
         default_target_path: /index

Когда я попытаюсь войти в систему, мне будет отказано на основании «недействительных учетных данных», хотя я уверен, что мои учетные данные вводятся правильно. Я надеюсь, что основная проблема здесь в том, что «search_dn» и «search_password» являются моими собственными, и у меня нет прав администратора в нашей AD. Похоже (согласно документации Symfony), что эти кредиты должны принадлежать пользователю-администратору AD. Я жду эту информацию от моего системного администратора, но она должна пройти по цепочке, поэтому это может занять некоторое время. Я попытался заменить их оба нулями, что выдает другую ошибку.

Мой вопрос возникает в этот момент, поскольку я действительно могу установить успешное соединение и привязаться к нашей AD, используя только PHP со следующим кодом:

//ldapconnect.php

$ldap = ldap_connect("host.dom1.dom2.net");

if (ldap_bind($ldap, "[email protected]", "myPassword")) {
    echo "login successful";
 } else {
    echo "Incorrect Login";
}

В основном я ищу, могу ли я каким-то образом воспроизвести приведенный выше автономный код привязки PHP ldap в свой проект Symfony (кажется, что строка dn, необходимая в Symfony, вызывает проблему). Я новичок в этом, поэтому я не могу понять, почему автономный PHP-код разрешает привязку LDAP, а использование строки dn — нет (за исключением того, что наша AD, возможно, блокирует запрос при использовании строки dn).

Заранее благодарим вас за любую помощь.

Изменить: добавлена ​​информация о DN поиска администратора, доступная только для чтения:

//security.yml

my_ldap:
      ldap:
         service: Symfony\Component\Ldap\Ldap
         base_dn: 'CN=Users,dc=dom1,dc=dom2,dc=net'
         search_dn: "cn=ReadOnlyAdmin,OU=ou1,OU=ou2,dc=dom1,dc=dom2,dc=net"
         search_password: adminPass
         default_roles: ROLE_USER
         uid_key: sAMAccountName
....
firewalls:
      http_basic_ldap:
         provider: my_ldap
         service: Symfony\Component\Ldap\Ldap
         dn_string: 'DOMAIN\{username}'

Похоже, что я, по крайней мере, теперь могу подключиться к серверу ldap, однако я все еще получаю неверные учетные данные с ошибкой «пользователь не найден»:

//dev.log

[2017-09-11 13:10:15] request.INFO: Matched route "app_default_admin". {"route":"app_default_admin","route_parameters":{"_controller":"AppBundle\\Controller\\DefaultController::adminAction","_route":"app_default_admin"},"request_uri":"http://localhost:8000/index","method":"GET"} []
[2017-09-11 13:10:15] security.INFO: Basic authentication Authorization header found for user. {"username":"myUsername"} []
[2017-09-11 13:10:15] security.INFO: Basic authentication failed for user. {"username":"myUsername","exception":"[object] (Symfony\\Component\\Security\\Core\\Exception\\BadCredentialsException(code: 0): Bad credentials. at C:\\pathtoSymfonyProject\\vendor\\symfony\\symfony\\src\\Symfony\\Component\\Security\\Core\\Authentication\\Provider\\UserAuthenticationProvider.php:73, Symfony\\Component\\Security\\Core\\Exception\\UsernameNotFoundException(code: 0): User \"myUsername\" not found. at C:\\pathtoSymfonyProject\\vendor\\symfony\\symfony\\src\\Symfony\\Component\\Security\\Core\\User\\LdapUserProvider.php:82)"} []

Я также задаюсь вопросом об этой ошибке «Пользователь \"myUsername\" не найден» ближе к концу третьей строки, ищет ли она в AD имя пользователя «myUsername\» и добавляет обратную косую черту? Это может быть просто формат кода ошибки, поскольку он выглядит правильным во второй строке и начале третьей строки.

Редактировать 2:

Наконец-то я заработал соединение, правильная конфигурация выглядит следующим образом:

//security.yml

my_ldap:
      ldap:
         service: Symfony\Component\Ldap\Ldap
         base_dn: 'dc=dom1,dc=dom2,dc=net'
         search_dn: "cn=ReadOnlyAdmin,OU=ou1,OU=ou2,dc=dom1,dc=dom2,dc=net"
         search_password: 'adminPass'
         default_roles: ROLE_USER
         uid_key: sAMAccountName
....
firewalls:
      http_basic_ldap:
         provider: my_ldap
         service: Symfony\Component\Ldap\Ldap
         dn_string: 'MYDOMAIN\{username}'

Из моего предыдущего редактирования все, что мне нужно было сделать, это удалить «CN = Users» из base_dn, поскольку учетные записи пользователей фактически не находились там, удаление этого и просто оставление компонентов домена позволяло искать пользователя во всем нашем AD. Еще одно важное замечание заключается в том, что dn_string должен быть настроен как «MYDOMAIN\{username}», иначе аутентификация не пройдет (согласно ответу Элвина Банка). Как указывает Элвин в своей статье, ссылка на которую приведена ниже, эта часть, к сожалению, не упоминается в документации Symfony LDAP.


person TomShelby    schedule 08.09.2017    source источник


Ответы (1)


Взгляните на мою недавнюю статью об этом:

https://alvinbunk.wordpress.com/2017/09/07/symfony-ldap-component-ad-authentication/

Я подозреваю, что вам просто нужно изменить свой dn_string следующим образом:

dn_string: 'DOMAIN\{username}'

Пожалуйста, прочитайте мою статью. Также попробуйте:

default_roles: ROLE_USER

Вы также можете попробовать использовать http_basic_ldap в соответствии с моей статьей и проверить журнал разработки. Это, наверное, что-то простое - не сдаваться!

person Alvin Bunk    schedule 08.09.2017
comment
Привет, Альвин, спасибо за быстрый ответ. Я обновил свою конфигурацию, чтобы отразить ваше предложение вместе с тем, что опубликовано в вашей статье. С тех пор я также получил учетную запись администратора только для чтения для нашей AD. Я обновил свой пост, чтобы показать новую конфигурацию вместе с сообщением журнала ошибок. Кажется, теперь я могу подключиться к серверу ldap, однако я все еще получаю сообщение об ошибке «неверные учетные данные» / «пользователь не найден» (журнал ошибок также отображается в редактировании). - person TomShelby; 11.09.2017
comment
Является ли DOMAIN правильным доменом Windows? Я сомневаюсь? Я привел это в качестве примера... Сообщение об ошибке просто показывает кавычки вокруг myUsername, что правильно. С помощью браузера LDAP вы искали myUsername под базовым DN CN=Users,dc=dom1,dc=dom2,dc=net. Пользователь myUsername также должен существовать там. Я думаю, у вас почти все получилось! - person Alvin Bunk; 12.09.2017
comment
Вы также можете попробовать Active Directory Explorer и попробовать использовать только для чтения -admin, затем разверните CN=Configuration,DC=dom1,DC=dom2,DC=net и под ним разверните CN=Partitions. У вас должен быть домен Windows для использования под этим. Он будет иметь значение nETBIOSName. - person Alvin Bunk; 12.09.2017
comment
Извините, я должен был уточнить, что на самом деле я использовал правильный домен нашей компании в моем последнем редактировании, а не буквально ДОМЕН. С тех пор у меня работает соединение! У меня была небольшая ошибка с base_dn, как вы указали, просто пришлось удалить CN = Users, поскольку пользователи фактически не находились там, что затем позволило выполнить поиск по всему AD. Я приму ваш первый ответ в качестве ответа, потому что без установки dn_string в DOMAIN\{username} соединение абсолютно не будет работать. Еще раз спасибо, Элвин, ты мужчина. - person TomShelby; 12.09.2017
comment
Привет @TomShelby Я некоторое время пытался настроить систему аутентификации LDAP под Symfony. Я пытался точно следовать тому, что вы уже сделали и что работает для вас. Но я все еще сталкиваюсь с проблемами подключения. Вы видите ниже мой код. - person Yssn; 06.07.2018