在Symfony 3中使用LDAP连接/绑定到Active Directory(Windows),而不使用dn字符串

时间:2017-09-08 21:25:56

标签: php symfony active-directory ldap symfony3.x

我正在尝试使用Active Directory对我公司的用户验证Symfony3应用程序。我当前的配置如下(这也是使用在线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管理员用户的信用。我正在等待我的系统管理员的这些信息,但它必须上链,所以可能需要一段时间。我尝试用空值替换它们,这会引发不同的错误。

我的问题是在这一点上,因为我实际上能够建立一个成功的连接&使用PHP单独使用以下代码与AD绑定:

//ldapconnect.php

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

if (ldap_bind($ldap, "myUsername@dom1.dom2.net", "myPassword")) {
    echo "login successful";
 } else {
    echo "Incorrect Login";
}

基本上我想看看能否以某种方式将上面的独立PHP ldap绑定代码复制到我的Symfony项目中(似乎Symfony中所需的dn字符串导致了问题)。我是相当新的,所以我不太明白为什么独立的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)"} []

我也在第三行末尾质疑这个“User \”myUsername \“not found”错误,是否在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}'

从我之前的编辑开始,我所要做的就是从base_dn中删除“CN = Users”,因为用户帐户实际上并不在那里,删除它并只是离开域组件允许我们搜索整个AD用户。另一个重要的注意事项是dn_string必须配置为 'MYDOMAIN \ {username}'或身份验证不会通过(根据Alvin Bunk的回复)。正如Alvin在下面链接的文章中指出的那样,遗憾的是,在Symfony LDAP文档中没有提到该部分。

1 个答案:

答案 0 :(得分:0)

看看我最近关于此的文章:

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并查看开发日志。它可能很简单 - 不要放弃!