Я недавно написал класс аутентификации ldap (работающий с Active Directory) и недавно создал новое веб-приложение для другого отдела, который использует этот класс проверки подлинности ,PHP/LDAP: фильтр плохих результатов (OU с амперсандом)
В основном пользователь вводит свои учетные данные, мой скрипт связывается с AD и проверяет, является ли пользователь членом определенной группы. Аутентификация пароля работает каждый раз, но проверка членства в группах работает только, если пользователь не находится в подразделении или ниже него с амперсандом в его имени.
Проблема заключается в том, что название отдела содержит амперсанд, и поэтому организационная единица тоже делает это. Несмотря на то, что у меня есть разрешения в AD для изменения имени, наиболее вероятно, что другие приложения получают доступ к этому OU по имени, поэтому я не могу его изменить (также я не знаю, существуют ли другие OU с амперсандами в их именах, такая же проблема может возникнуть позже).
Смешная вещь: Если я использую ldp.exe под окнами, я могу использовать тот же самый фильтр поиска без каких-либо проблем, поэтому я думаю, что это проблема с правильной передачей самого символа (мое приложение использует UTF-8 и амперсанд символы отображаются правильно, когда вытащили из AD и печататься, поэтому я не думаю, что это проблема кодирования)
линии я использую для создания фильтра является:
$filter = "(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=".$userdn."))";
где userdn происходит от другого ldap_search до, где я успешно проверил пароль пользователя.
Я действительно споткнулся, потому что на самом деле я использую DN, который я использую для группового запроса из активного каталога (и, похоже, он правильно экранирован), но не может использовать его в другом ldap_search.
Я уже пытался убежать/замену & -symbol с некоторыми альтернативами:
\&
&
%26
и множества вариантов тех, но все они eturn то же самое ошибка «плохого фильтра».
(PHP Version 5.3.2-1ubuntu4.17)
Может кто-нибудь сказать мне, что я делаю неправильно здесь?
Я гораздо больше думал о '' 'члена: 1.2.840.113556.1.4.1941:' '' -часть.Насколько я могу видеть на веб-сайте MSDN https://msdn.microsoft.com/en-us/library/aa746475(v=vs.85).aspx, вы должны заключить имя пользователя-DN в круглые скобки, чтобы инкапсулировать '' '=' '' внутри DN от того, который связывает этот атрибут с DN. Можете ли вы проверить это и отчитаться? – heiglandreas
Я просто поиграл с некоторыми вариантами включения dn, но не повезло. Если я это в ldp-инструменте, фильтр принимается, но не возвращает никаких результатов (пока он работал с не заключенным dn). PS: Спасибо за троп, даже это не было решением, я бы никогда не подумал об этом .. может пригодиться в будущем. –
Hm. Поскольку в настоящее время у меня нет AD, я не могу проверить это. У вас было объявление http://stackoverflow.com/questions/12562275/ldap-nested-group-membership-filter и, особенно, ссылка на синтаксис фильтра поиска? – heiglandreas