返回

如何使用PHP通过LDAPS连接Azure AD?

php

如何使用 PHP 通过 LDAPS 连接 Azure Active Directory

你正在尝试使用 PHP 连接到 Azure Active Directory (Azure AD) 并获取用户列表吗?你是否已启用 Microsoft Entra Domain Services (Entra DS) 并配置了安全的 LDAP (LDAPS) 连接?如果你对 LDAP 不太熟悉,可能会遇到一些困难。

本文将指导你解决使用 PHP 通过 LDAPS 连接 Azure AD 时遇到的常见问题,并提供代码示例和解决方案。

问题根源

许多开发者在尝试使用 ldap_connect 函数建立与 LDAPS 服务器的连接时,会遇到“无法连接到 LDAP 服务器”的错误,即使代码看起来没有问题。

这是因为 LDAPS 的安全特性需要进行额外的配置,例如网络连接、防火墙设置、证书验证以及正确的身份验证信息,才能成功建立连接。

解决方案详解

1. 网络畅通是关键

首先,确保你的 PHP 服务器可以访问 Entra DS 实例的 LDAPS 端口 (默认端口为 636)。

你可以使用 telnet 命令测试连接:

telnet your-entra-ds-instance.example.com 636

如果连接成功,你将看到一个空白的终端窗口。如果连接失败,你将收到一个错误消息。

2. 防火墙设置不容忽视

Azure 和你本地环境的防火墙都可能阻止 LDAPS 连接。

  • 在 Azure 上,你需要配置网络安全组,允许从你的 PHP 服务器到 Entra DS 实例的 LDAPS (636) 端口的出站流量。
  • 在你的本地环境中,你需要确保你的防火墙允许从你的 PHP 服务器到 Entra DS 实例的 LDAPS (636) 端口的出站流量。

3. 证书配置是保障

LDAPS 使用 SSL/TLS 加密连接,因此你的 PHP 环境需要正确配置证书才能建立安全连接。

你需要下载 Entra DS 实例的 SSL/TLS 证书,并将其添加到你的 PHP 环境中。

你可以参考 PHP 文档了解如何配置 SSL/TLS 证书: https://www.php.net/manual/en/openssl.installation.php

4. 身份验证是基础

在使用 ldap_bind 函数进行绑定时,你提供的用户名 (ldaprdn) 或密码 (ldappass) 可能不正确。

  • 请仔细检查你使用的凭据是否正确,确保该用户存在于 Azure AD 并且具有访问 Entra DS 的权限。
  • 用户名需要使用完全限定的用户名格式,例如: [email protected]
  • 你可以尝试使用其他 LDAP 客户端工具 (如 Apache Directory Studio) 测试你的凭据。

5. 搜索范围要精准

使用 ldap_search 函数时,你需要指定正确的 LDAP 搜索范围才能找到用户。

搜索范围使用 LDAP 的 Distinguished Name (DN) 格式,例如: "OU=AADDC Users,DC=example,DC=co,DC=uk"

你需要根据你的 Entra DS 实例的配置修改搜索范围。

代码示例

以下是一个使用 PHP 通过 LDAPS 连接 Azure AD 并获取用户列表的示例代码:

<?php

// Entra DS 实例的域名
$domain = "ds.example.co.uk"; 
// Entra DS 实例的LDAPS端口
$port = 636; 
// 你的用户名 (格式为 [email protected])
$username = "[email protected]"; 
// 你的密码
$password = "your_password"; 

// LDAP搜索范围
$baseDn = "OU=AADDC Users,DC=example,DC=co,DC=uk";

// 连接到 LDAPS 服务器
$ldapconn = ldap_connect("ldaps://$domain:$port") or die("Could not connect to LDAP server.");

if ($ldapconn) {
  
  // 设置LDAP协议版本
  ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);

  // 绑定到 LDAP 服务器
  $ldapbind = ldap_bind($ldapconn, $username, $password);

  if ($ldapbind) {
    echo "LDAP bind successful\n";

    // 搜索用户
    $filter = "(objectClass=user)";
    $attributes = array("cn", "mail"); 
    $result = ldap_search($ldapconn, $baseDn, $filter, $attributes);

    // 获取搜索结果
    $entries = ldap_get_entries($ldapconn, $result);

    // 打印用户列表
    for ($i=0; $i < $entries["count"]; $i++) { 
      echo $entries[$i]["cn"][0] . " - " . $entries[$i]["mail"][0] . "\n";
    }

  } else {
    echo "LDAP bind failed...\n";
  }

  // 关闭连接
  ldap_close($ldapconn);

}

?>

常见问题解答

1. 为什么我无法连接到 LDAPS 服务器?

这可能是由网络连接问题、防火墙设置、证书问题或身份验证问题造成的。请仔细检查你的配置。

2. 如何找到我的 Entra DS 实例的 SSL/TLS 证书?

你可以使用浏览器访问你的 Entra DS 实例的 LDAPS 地址,并下载证书。

3. 如何确定我的 LDAP 搜索范围?

你可以使用 LDAP 浏览器工具 (如 Apache Directory Studio) 连接到你的 Entra DS 实例,并浏览目录结构以找到正确的搜索范围。

4. 为什么我无法使用匿名绑定连接到 Entra DS?

出于安全原因,Entra DS 不允许匿名绑定。你需要使用具有足够权限的用户凭据进行绑定。

5. 如何获取更多关于 PHP LDAP 函数的信息?

你可以查阅 PHP 官方文档: https://www.php.net/manual/en/book.ldap.php