我对LDAP不太熟悉,但我正在Node.js应用程序中进行身份验证,并且将从组织的Windows域获取Web应用程序的用户凭据。
我有LDAP查找工作(使用Passport.js
节点模块),但为了使其工作,我必须将用户的完整DN放入Node。例如,让我们说:
我的FQDN为mydomain.private.net
。
我的用户存储在一个单位部门,比方说staff
。
现在,如果我想查找用户joe
,我必须将此字符串放入Node:
var username = 'CN=joe,OU=staff,DC=mydomain,DC=private,DC=net';
如果我的用户位于两个不同的组织单位,该怎么办?客户端浏览器不知道这一点!它只知道:
username = 'joe';
password = 'xxxxx';
如果您尝试以管理员身份登录该怎么办?默认情况下,管理员总是处于完全不同的OU中。
有没有办法只通过名称引用LDAP对象而没有其他内容?
答案 0 :(得分:2)
这是一个常见的LDAP问题。您需要从用户那里获取唯一标识符,然后查找它。
通常,这是uid
属性的用途。 Active Directory可能已填充,也可能没有填充,并且通常依赖于在域中必须唯一的sAMAccountName。
所以你需要一个两步的过程。
1)查询uid = joe或samAccountName = joe 2)使用结果来测试绑定或密码比较。
然后,您将使用DC=mydomain,DC=private,DC=net
值作为搜索的根。
答案 1 :(得分:1)
geoffc的回答是正确的,这是使用activedirectory
npm模块适应我的Node.js应用程序的工作解决方案:
// 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);
}
});
}
});