【问题标题】:Invalid credentials while authenticating users on Active Directory with PHP使用 PHP 在 Active Directory 上对用户进行身份验证时凭据无效
【发布时间】:2021-06-17 13:29:06
【问题描述】:

这是我第一次需要使用远程 Active Directory 对我的 PHP 应用程序上的用户进行身份验证。我在网上找到了一个测试服务器this link,并编写了一些代码来连接到服务器并在测试模式下进行身份验证:

$ldap_server = 'www.zflexldap.com';
$ldap_server_port = 389;
$ldap_username = 'guest1';
$ldap_password = 'guest1password';
$ldap_base_dn = 'ou=users,ou=guests,dc=zflexsoftware,dc=com';

$ldap_connection = ldap_connect($ldap_server, $ldap_server_port);

if ($ldap_connection === false) {
    echo 'Connection failed';
} else {
    echo 'Connected<br>';
}

ldap_set_option($ldap_connection , LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap_connection , LDAP_OPT_REFERRALS, 0);

$bind = ldap_bind($ldap_connection, 'uid='.$ldap_username.','.$ldap_base_dn, $ldap_password);
if ($bind) {
    echo 'Successful login';
} else {
    echo 'Failed login';
}

执行这段代码的结果是:

连接
登录成功

之后,我在虚拟机上创建了一个真正的 Active Directory Server,并在该服务器中定义了如下用户:

然后,我将连接变量更改为以下几行:

$ldap_server = 'SERVER_IP';
$ldap_server_port = 389;
$ldap_username = 'test1';
$ldap_password = 'test1_password';
$ldap_base_dn = 'ou=users,dc=website,dc=com'; // Imagine domain as website.com on AD  

现在,当我想连接到 ldap 服务器并对用户 test1 进行身份验证时,我得到了以下结果:

连接
警告:ldap_bind():无法绑定到服务器:第 25 行的 index.php 中的凭据无效
登录失败

我确定用户名和密码正确。我想问题可能出在base_dn,但是当我检查服务器设置时,我在我的代码中写的内容没有发现任何错误。

你能帮我解决这个问题吗?

【问题讨论】:

  • 您是在 Windows 还是 Linux 上运行 PHP 代码?我问是因为如果您使用 IIS 运行 PHP,您可以在 IIS 中使用集成的 Windows 身份验证来检查用户与 AD,然后 PHP 可以访问他们的身份 - 比上述方法容易得多。
  • @ADyson 我在 Windows 和 Linux 服务器上运行代码,但通过 Apache Web 服务器。
  • 您应该仍然可以按照stackoverflow.com/a/34136128/5947043 进行操作,以使 Windows 身份验证与 Apache 一起工作。这是您应该在网络服务器级别而不是应用程序级别执行的操作。另见httpd.apache.org/docs/2.4/mod/mod_authnz_ldap.html
  • 问题不在于 PHP 模块。正如我在第一次测试中提到的那样,它运作良好。在我在服务器 #1 上成功进行身份验证的同一台 Web 服务器上,我遇到了服务器 #2 的问题。
  • 你误会我了。我提出了一种完全不同(但更传统)的方法,它根本不涉及您上面的任何代码,只是您的网络服务器中的一些配置。

标签: php authentication active-directory ldap


【解决方案1】:

一般来说,要绑定到 LDAP,您将使用一个专有名称,如果您有任何层次结构,那么在 Active Directory 的情况下就不容易猜到。您的具体示例的 DN 可能为 CN=test1,CN=Users,DC=website,DC=com。但是如果用户位于不同的OU,可能无法猜测DN,您需要一个专门的用户首先通过他的sAMAccountName找到用户的DN。

但是,使用 AD,您可以使用用户主体名称进行绑定。这可能是userPrincipalName 属性的值,但它也可以是user@domain 形式的隐式UPN,因此在您的情况下为test1@website.com。使用这种方法,您不需要知道用户的层次结构,用户名(带域)和密码应该足以绑定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    相关资源
    最近更新 更多