当前位置:  开发笔记 > 编程语言 > 正文

使用LDAP通过Active Directory在PHP中进行身份验证

如何解决《使用LDAP通过ActiveDirectory在PHP中进行身份验证》经验,为你挑选了6个好方法。

我正在寻找一种通过LDAP使用PHP验证用户的方法(Active Directory是提供者).理想情况下,它应该能够在IIS 7上运行(adLDAP在Apache上运行).有没有人做过类似的事情,成功了?

编辑:我更喜欢一个库/类,代码已准备就绪......当有人已经这样做时,发明轮子是愚蠢的.

ceejayoz.. 166

当您需要的只是两行代码时,导入整个库似乎效率低下......

$ldap = ldap_connect("ldap.example.com");
if ($bind = ldap_bind($ldap, $_POST['username'], $_POST['password'])) {
  // log them in!
} else {
  // error message
}

如果提供的密码为空,则某些AD安装将成功绑定.当心这个!在尝试进行身份验证之前,您可能需要确保非空密码. (43认同)


ChadSikorra.. 14

你会认为简单地在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.



1> ceejayoz..:

当您需要的只是两行代码时,导入整个库似乎效率低下......

$ldap = ldap_connect("ldap.example.com");
if ($bind = ldap_bind($ldap, $_POST['username'], $_POST['password'])) {
  // log them in!
} else {
  // error message
}


如果提供的密码为空,则某些AD安装将成功绑定.当心这个!在尝试进行身份验证之前,您可能需要确保非空密码.

2> ChadSikorra..:

你会认为简单地在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.


@zenlord不建议使用ldaps://格式的连接。在我的示例中,当您指定`setUseTls(true)`时,它使用`ldap://`格式,然后使用`ldap_start_tls($ connection)`发出StartTLS。因此TLS本身并没有被弃用,只是使用ldaps://(实际上是通过完全不同的端口连接到LDAP)进行连接。

3> Scott Reynen..:

我只需将用户凭据传递给ldap_bind()即可.

http://php.net/manual/en/function.ldap-bind.php

如果帐户可以绑定到LDAP,则它是有效的; 如果它不能,那就不是.如果您所做的只是身份验证(而不是帐户管理),我认为不需要库.



4> CMS..:

我喜欢Zend_Ldap类,你可以在项目中只使用这个类,而不使用Zend Framework.



5> Darryl Hein..:

PHP有库:http://ca.php.net/ldap

PEAR还有许多软件包:http://pear.php.net/search.php? q =ldap&in = package&x = 0&y = 0

我也没有使用过,但我曾经在某个时刻,他们似乎应该工作.



6> Joe Meyer..:

对于那些寻找完整示例的人,请查看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域控制器.

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有