题 使用PHP从LDAP验证用户


我的项目是为我们的大学制作模块注册系统。所以我联系了我大学的IT人员,详细了解了学生进入系统的情况。我们正在使用现有的大学登录系统开发系统。他们给了我一些LDAP信息,我不知道它的用法。 我在Apacha服务器上使用PHP,Mysql。 如果用户ID和密码包含LDAP信息,我如何验证登录系统的用户。

以下是LDAP信息(我更改了域名等)

blueroom.ac.uk域的LDAP信息


LDAP Host : ad.blueroom.ac.uk

LDAP port no: 389

BASE DN : ou=bluebird, dc=bluebird, dc=ac, dc=my

LDAP account to bind : cn = kikdap, ou=servacc, dc=bluebird,dc=ac,dc=uk

LDAP account password : ********

Attribute : sAMAccountName 

35
2018-02-13 15:50


起源


如果您的服务器是Linux机器,如果没有适当的服务器证书,您将无法与AD通信。如果您需要大学的帮助,这可能是一个问题。


答案:


一般程序是(括号中的相关ext / ldap php命令):

  1. 使用“LDAP主机”和“LDAP端口号”连接到LDAP服务器(ldap_connect())并设置正确的连接选项(ldap_set_option()),尤其如此 LDAP_OPT_PROTOCOL_VERSION 和 LDAP_OPT_REFERRALS

  2. 使用“LDAP帐户绑定”和“LDAP帐户密码”绑定到LDAP服务器(的ldap_bind()) - 如果您要对Active Directory服务器进行身份验证,则可以直接使用登录页面中的用户名和密码,并跳过以下所有步骤。

  3. 通过指定“BASE DN”和相应的LDAP过滤器来搜索树中的匹配用户条目/对象 - 很可能是类似的东西 (&(objectClass=user)(sAMAccountName=%s)) 哪里 %s 应该被要认证的用户名替换(ldap_search()

  4. 检查返回的条目数是否为1(如果<> 1则出现问题,例如找不到用户或找到多个用户)

  5. 检索此单个条目的可分辨名称(DN)(ldap_get_dn()

  6. 使用上一步中找到的DN尝试使用身份验证页面上给出的密码绑定到LDAP服务器(的ldap_bind()

  7. 如果绑定成功则一切正常,如果没有,很可能是密码错误

它起初并不像听起来那么难。一般来说,我建议使用某种标准库来对LDAP服务器进行身份验证,例如 Net_LDAP2 梨包或 Zend_Ldap 出来的 Zend框架。我没有实际使用经验 Net_LDAP2 (虽然我很清楚代码)但是 Zend_Ldap 适用于Active Directory服务器或ADAMS服务器(这显然是您正在使用的)。

这将使用诀窍 Zend_Ldap

$options = array(
    'host'                 => 'ad.blueroom.ac.uk',
    'useStartTls'          => true,
    'accountDomainName'    => 'blueroom.ac.uk',
    'accountCanonicalForm' => 4,
    'baseDn'               => 'ou=bluebird,dc=bluebird,dc=ac,dc=my',
);
$ldap = new Zend_Ldap($options);
try {
    $ldap->bind('user', 'password');
} catch (Zend_Ldap_Exception $e) {
    // something failed - inspect $e
}
// bind successful
$acctname = $ldap->getCanonicalAccountName('user', Zend_Ldap::ACCTNAME_FORM_DN);

52
2018-02-13 18:05



只是按照你的一些步骤,让它像魅力一样工作......通过本机PHP LDAP模块路由。 - on_
对使用此方法的用户请注意:如果您的ldap服务器允许匿名登录,请确保在尝试身份验证之前将空密码过滤为无效。 - Tyzoid
我正在针对Active Directory服务器进行身份验证,但仍需要完成所有步骤7。 - Jibbyj


你可以试试 http://code.activestate.com/recipes/101525/ 同时指的是 http://us3.php.net/ldap 以及Google搜索的其他结果 [php ldap验证]


4
2018-02-13 15:54





你可以用 http://pear.php.net/package/Net_LDAP2/docs 这很好,很有效。

doc所做的连接示例:

// Inclusion of the Net_LDAP2 package:
require_once 'Net/LDAP.php';

// The configuration array:
$config = array (
    'binddn'    => 'cn=admin,ou=users,dc=example,dc=org',
    'bindpw'    => 'password',
    'basedn'    => 'dc=example,dc=org',
    'host'      => 'ldap.example.org'
);

// Connecting using the configuration:
$ldap = Net_LDAP2::connect($config);

// Testing for connection error
if (PEAR::isError($ldap)) {
    die('Could not connect to LDAP-server: '.$ldap->getMessage());
}

2
2017-07-23 19:25





@Stephen提供了很好的分数。这是我使用AD进行身份验证的纯PHP代码:

  1. 首先,您需要知道这些参数:服务器主机,用户域(如果需要查询AD,还需要基数dn)。
  2. 使用以下代码:

    $ldap = ldap_connect($host); // e.g. 165.5.54.6 or an URL
    ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); // Recommended for AD
    ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
    $bind = ldap_bind($ldap, $username.'@'.$userDomain, $passwrod);
    
    if($bind){
    // successful authentication. 
    }
    

2
2018-06-04 05:59



小心:LDAP的某些实现返回true ldap_bind 当密码为空时。你可能应该 检查密码是否为空。 - Johann150