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