2007-05-25

PHP LDAP连接微软活动目录进行身份验证

Views: 24552 | 6 Comments

如果使用活动目录(Active Directory)代替在数据库表中建立账号, 你可以使用原来Windows网络中的账号.

LDAP, 轻量级目录访问协议(Lightweight Directory Access Protocol), 是用来访问微软的活动目录等目录服务器(DS, Directory Server)的协议. PHP默认支持LDAP.

下面是使用LDAP进行用户身份验证的PHP程序. 在微软的活动目录中, 用户的唯一标识是"samaccountname", 有些DS是"uid". 方法是:

  1. 用有权限的账号的dn(形如 cn=user_name,ou=web,dc=ideawu,dc=com)连接LDAP Server.
  2. 根据登录用户的名字查询其dn.
  3. 用该dn连接LDAP Server. 如果连接上就是登录成功.

注意! 微软的活动目录服务器可以使用空账号连接成功(设置问题? 默认? 特例?)!

$userid = $_POST['userid'];
$user_password = $_POST['password'];

if($userid && $user_password){
// config
// $ldap_server = "ideawu.com";
// $ldap_admin = "user_name";
// $ldap_password = "xxx";
// $base_cn = "ou=web,dc=ideawu,dc=com";
	$conn = ldap_connect($ldap_server);
	if(!$conn){
		die("<br>Connection LDAP server error");
	}
	$bind = ldap_bind($conn, $ldap_admin, $ldap_password);
	if(!$bind){
		die("<br>Bind LDAP server error");
	}

	$filter = 'samaccountname=' . $userid;
	$attributes = array('mail');	
	$result = ldap_search($conn, $base_dn, $filter, $attributes);
	$info = ldap_get_entries($conn, $result);

	if(!$result){
		die("<br>Search failed");
	}

	if($info["count"] != 0){
		$user_dn = $info[0]["dn"];
		unset($bind2);
		$bind2 = @ldap_bind($conn, $user_dn, $user_password);
		if($bind2){
			// Login done. Set session
		}
	}

	ldap_close($conn);
}

Related posts:

  1. 史上最强大的PHP MySQL操作类
  2. PHP查询MySQL大量数据的内存占用分析
  3. LevelDB 的原理和动机
  4. HTTP POST using PHP cURL
  5. Nginx 安装 HTTPS SSL 证书
Posted by ideawu at 2007-05-25 18:20:49

6 Responses to "PHP LDAP连接微软活动目录进行身份验证"

  • 请教,我用的只有ldap_connect和 ldap_bind俩个函数,ldap_bind连接上就算登录成功不可以吗?但是ldap_bind这个函数 用普通用户连接不上是什么原因? Reply
  • 有两个问题想请教:

    $attributes = array(‘mail’);

    请问这是什么意思,一定要写这行代码吗?

    $result = ldap_search($conn, $base_dn, $filter, $attributes);

    这种搜索是不是查找整个目录,如想特定查找某个目录,怎么写?

    谢谢! Reply
  • 我们在email里交谈, 我的email是 ideawu在163,com. 你用email把问题描述清楚, 最好在email贴出完整的代码. Reply
  • thanks!用户名前面加上域名就可以。但是在LDAP_Searth行出现错误:Warning: ldap_search() [function.ldap-search]: Search: No such object



    base_dn我用LDAP工具测试正确,是filter或attributes有错误? Reply
  • 确认你的服务器地址, 用户名, 密码, base_cn都设置对了, 如果不确定, 询问网络管理员. Reply
  • 您好!,我在使用是出现如下错误:

    Warning: ldap_search() [function.ldap-search]: Search: Operations error

    请问是什么原因? Reply

Leave a Comment