这篇文章似乎一半是关于编程,一半是关于管理,所以我不确定它属于哪一类。SO 和 SU 似乎都不完全正确。请随意重定向。
旧情况:
域内的现有 PHP 网站在用户登录应用程序时连接到 Active Directory 进行身份验证和身份识别。
新情况:
将网站移至 Azure 上的 VM。不移动 AD。需要远程连接到 AD。
他们不想仅仅为了这个而迁移到 Azure AD。
我听说之前的开发人员找到了一个插件,可以帮助建立这种连接,而且测试时效果很好。所以他们决定继续这个项目,就在他们闹翻之前。
根据该信息,我认为这将是一个简单的项目,但我没有发现任何类似的东西,也没有收到有关该插件的任何说明。
看起来他们没有使用 VPN,但如果我无法让它工作,我可能不得不回到 VPN。
请注意,这不是远程桌面或 AD 的远程管理,而是用户的远程身份验证。
更新:身份验证目前看起来像这样,其中 Bind 返回一个布尔值:
// Authenticate against LDAP
$linkLdapConnection = ldap_connect($this->objConfiguration->sDomainName);
if (!$linkLdapConnection) {
$this->aReadOnlyVars['sSecurityError'] = "Domain connection failure.";
return false;
}
$bLdapBind = @ldap_bind($linkLdapConnection, $sUserLogin . "@" . $this->objConfiguration->sDomainName, $sUserPassword);
答案1
虽然加入域的主机使用大量协议与 Active Directory 进行通信(幸运的是,所有协议都是基于 TCP/IP),但其核心有两个标准协议:用于安全身份验证的 Kerberos 和用于用户目录访问的 LDAP。
如果你的唯一目标是检查密码(如您发布的代码示例一样),您实际上并不需要使用任何 AD 特定的软件 – PHP 的一部分“ldap”模块就足够了。
然而,在处理通用 LDAP 时,在初始代码行中 –
$linkLdapConnection = ldap_connect($this->objConfiguration->sDomainName);
– 仅指定域名可能还不够;您需要指定特定服务器的完整 URL,例如ldaps://ad.example.com
或ldaps://dc01.ad.example.com
。
就防火墙配置而言,LDAP 通过 TCP 端口 389 或 636 工作。(Windows AD 特定功能也可能使用 UDP 端口 389 进行“DC ping”,但通用 LDAP 客户端不会这样做。)
当你向服务器发送纯文本密码时,你确实想要使用带 TLS 的 LDAP – 通过指定ldaps://
URL 或调用ldap_start_tls()
。前者将使用 TCP 端口 636,更安全,而后者将使用端口 389。
(这也意味着域控制器必须具有有效的 TLS 证书安装。并非所有域都安装有该协议,因为 Windows 本身更喜欢使用 Kerberos 保护,不需要 TLS。