Connect/Bind 到 Active Directory (Windows) 在 Symfony 3 中使用 LDAP 而不使用 dn 字符串
Connect/Bind to Active Directory (Windows) using LDAP in Symfony 3 without using a dn string
我正在尝试使用 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
当我尝试登录时,我会根据 "invalid credentials" 被拒绝,而我确定我的凭据输入正确。我希望这里的主要问题是 "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 服务器,但是我仍然收到无效凭据并出现 "user not found" 错误:
//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",因为用户帐户实际上并不位于那里,删除它并只留下域组件允许我们要搜索用户的整个广告。另一个重要注意事项是 dn_string 必须配置为
'MYDOMAIN\{username}' 否则身份验证将无法通过(根据 Alvin Bunk 的回复)。正如 Alvin 在下面链接的文章中指出的那样,不幸的是,Symfony LDAP 文档中没有提到这一部分。
看看我最近关于这个的文章:
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
并查看开发日志。这可能很简单 - 不要放弃!
我正在尝试使用 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
当我尝试登录时,我会根据 "invalid credentials" 被拒绝,而我确定我的凭据输入正确。我希望这里的主要问题是 "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 服务器,但是我仍然收到无效凭据并出现 "user not found" 错误:
//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",因为用户帐户实际上并不位于那里,删除它并只留下域组件允许我们要搜索用户的整个广告。另一个重要注意事项是 dn_string 必须配置为 'MYDOMAIN\{username}' 否则身份验证将无法通过(根据 Alvin Bunk 的回复)。正如 Alvin 在下面链接的文章中指出的那样,不幸的是,Symfony LDAP 文档中没有提到这一部分。
看看我最近关于这个的文章:
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
并查看开发日志。这可能很简单 - 不要放弃!