Answers:
当您只需要两行代码时,导入整个库似乎效率很低。
$ldap = ldap_connect("ldap.example.com");
if ($bind = ldap_bind($ldap, $_POST['username'], $_POST['password'])) {
// log them in!
} else {
// error message
}
ldap_set_option
用来使其表现不同。也许设置协议版本?您将不得不尝试。我个人建议您还是为了确保安全而检查空密码。
ldap_bind
进行输入卫生处理,特殊字符也不是问题。
您会认为,简单地在Active Directory中对用户进行身份验证将是一个非常简单的过程,而无需使用库即可在PHP中使用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...
}
上面的authenticate调用将:
也有其他库可以做到这一点(例如Adldap2)。但是,我感到被迫提供足够的信息,因为投票最多的答案实际上是一个安全风险,要依靠它来完成输入验证而不使用TLS。
ldaps://
连接格式。在我的示例中,当您指定setUseTls(true)
它使用ldap://
格式时,然后使用发出StartTLS ldap_start_tls($connection)
。因此TLS本身并没有被弃用,只是使用进行了连接ldaps://
(实际上是通过完全不同的端口连接到LDAP)。
我只是通过将用户凭据传递给ldap_bind()来完成此操作。
http://php.net/manual/zh/function.ldap-bind.php
如果该帐户可以绑定到LDAP,则说明该帐户有效。如果不能,那不是。如果您要做的只是身份验证(而不是帐户管理),则看不到需要库。
我喜欢Zend_Ldap类,而没有Zend Framework,则只能在项目中使用该类。
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服务器(IIS6)和运行IIS 8的Windows Server 2012企业版同时连接到Windows Server 2003和Windows Server 2008 R2域控制器的性能。