LDAP - 仅按名称查找用户

时间:2013-10-18 05:38:01

标签: javascript node.js active-directory ldap

我对LDAP不太熟悉,但我正在Node.js应用程序中进行身份验证,并且将从组织的Windows域获取Web应用程序的用户凭据。

我有LDAP查找工作(使用Passport.js节点模块),但为了使其工作,我必须将用户的完整DN放入Node。例如,让我们说:

  1. 我的FQDN为mydomain.private.net

  2. 我的用户存储在一个单位部门,比方说staff

  3. 现在,如果我想查找用户joe,我必须将此字符串放入Node:

    var username = 'CN=joe,OU=staff,DC=mydomain,DC=private,DC=net';
    

    我真的必须跟踪所有这些吗?

    如果我的用户位于两个不同的组织单位,该怎么办?客户端浏览器不知道这一点!它只知道:

    username = 'joe';
    password = 'xxxxx';
    

    如果您尝试以管理员身份登录该怎么办?默认情况下,管理员总是处于完全不同的OU中。

    有没有办法只通过名称引用LDAP对象而没有其他内容?

2 个答案:

答案 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);
        }
      });  
    }
  });