LDAP – 仅按名称查找用户
我对LDAP不太熟悉,但是我正在使用Node.js应用程序进行身份validation,并且Web应用程序的用户凭据将从组织的Windows域中获取。
我有LDAP查找工作(使用Passport.js
节点模块),但是为了使其工作,我必须把用户的完整的DN到节点。 例如,让我们说:
-
我的FQDN是
mydomain.private.net
。 -
我的用户存储在一个组织单位,比方说
staff
。
现在,如果我想查找用户joe
,我必须把这个string放入Node:
var username = 'CN=joe,OU=staff,DC=mydomain,DC=private,DC=net';
我真的必须跟踪所有这一切吗?
如果我的用户在两个不同的组织单位呢? 客户端浏览器不知道! 它只知道:
username = 'joe'; password = 'xxxxx';
如果您尝试以pipe理员身份login,该怎么办? pipe理员默认情况下总是处于完全不同的OU。
有没有一种方法来引用一个LDAP对象的名字,而不是别的?
这是一个普通的LDAP问题。 您需要从用户那里获得唯一的标识符,然后查找它。
通常这是uid
属性的用途。 活动目录可能会或可能没有填充,并且通常依赖于域中必须是唯一的sAMAccountName。
所以你需要一个两步的过程。
1)查询uid = joe或samAccountName = joe 2)使用结果testing绑定或密码比较。
然后,您将使用DC=mydomain,DC=private,DC=net
值作为从中进行search的根目录。
(回答我自己的问题)
geoffc的答案是正确的,这是适用于我的Node.js应用程序使用activedirectory
npm模块的工作解决scheme:
// First search for the user itself in the domain. // If successfully found, the findUser function // will return the full DN string, which is // subsequently used to properly query and authenticate // the user. var AD = self.ADs[domain]; AD.findUser(username, function(err, user) { if (err) { cb(false, 'AD error on findUser', err); return; } if (!user) { cb(false, 'User does not exist', void 0); } else { username = user.dn; AD.authenticate(username, password, function(err, authenticated) { if (authenticated == false) { cb(false, err, void 0); return; } else { cb(true, 'Authenticated', void 0); } }); } });