我正在寻找一种通过 LDAP 和 PHP 对用户进行身份验证的方法(Active Directory 是提供者)。理想情况下,它应该能够在 IIS 7 上运行(adLDAP 在 Apache 上运行)。有人做过类似的事情,成功了吗?
编辑:我更喜欢带有可以使用的代码的库/类......当有人已经这样做时,发明轮子是愚蠢的。
当您只需要两行代码时,导入整个库似乎效率低下......
$ldap = ldap_connect("ldap.example.com");
if ($bind = ldap_bind($ldap, $_POST['username'], $_POST['password'])) {
// log them in!
} else {
// error message
}
您会认为在 Active Directory 中简单地对用户进行身份验证将是一个在 PHP 中使用 LDAP 的非常简单的过程,而无需库。但是有很多事情会很快使它复杂化:
您必须验证输入。否则,空的用户名/密码将通过。
绑定时应确保用户名/密码正确编码。
您应该使用 TLS 加密连接。
使用单独的 LDAP 服务器进行冗余,以防万一出现故障。
如果身份验证失败,则会收到信息性错误消息。
在大多数情况下,使用支持上述内容的 LDAP 库实际上更容易。我最终推出了自己的库来处理上述所有问题:LdapTools(嗯,不仅用于身份验证,它还可以做更多事情)。它可以像下面这样使用:
use LdapTools\Configuration;
use LdapTools\DomainConfiguration;
use LdapTools\LdapManager;
$domain = (new DomainConfiguration('example.com'))
->setUsername('username') # A separate AD service account used by your app
->setPassword('password')
->setServers(['dc1', 'dc2', 'dc3'])
->setUseTls(true);
$config = new Configuration($domain);
$ldap = new LdapManager($config);
if (!$ldap->authenticate($username, $password, $message)) {
echo "Error: $message";
} else {
// Do something...
}
上面的身份验证调用将:
验证用户名或密码都不是空的。
确保用户名/密码正确编码(默认为 UTF-8)
尝试备用 LDAP 服务器以防万一出现故障。
使用 TLS 加密身份验证请求。
如果失败(即锁定/禁用帐户等),请提供其他信息
还有其他库也可以执行此操作(例如 Adldap2)。但是,我觉得有足够的必要提供一些额外的信息,因为投票最多的答案实际上是一个安全风险,在没有完成输入验证并且不使用 TLS 的情况下依赖。
ldaps://
格式的连接。在我的示例中,当您指定 setUseTls(true)
时,它使用 ldap://
格式,然后使用 ldap_start_tls($connection)
发出 StartTLS。所以 TLS 本身并没有被弃用,只是使用 ldaps://
连接(它实际上通过一个完全不同的端口连接到 LDAP)。
我只是通过将用户凭据传递给 ldap_bind() 来做到这一点。
http://php.net/manual/en/function.ldap-bind.php
如果账号可以绑定LDAP,则有效;如果不能,那就不是。如果您所做的只是身份验证(而不是帐户管理),那么我认为不需要图书馆。
PHP 有库:http://ca.php.net/ldap
PEAR 还有许多包:http://pear.php.net/search.php?q=ldap&in=packages&x=0&y=0
我也没有使用过,但我打算在某个时候使用它们,它们似乎应该可以工作。
对于那些寻找完整示例的人,请查看 http://www.exchangecore.com/blog/how-use-ldap-active-directory-authentication-php/。
我已经测试了从 Windows Server 2003 Web Server (IIS6) 和运行 IIS 8 的 Windows Server 2012 企业到 Windows Server 2003 和 Windows Server 2008 R2 域控制器的连接。
不定期副业成功案例分享
ldap_set_option
使其以不同的方式运行。也许设置协议版本?您将不得不进行实验。为了安全起见,我个人建议您检查空密码。ldap_bind
会处理它,特殊字符不是问题。