Javascript LDAP-仅按名称查找用户

Javascript LDAP-仅按名称查找用户,javascript,node.js,active-directory,ldap,Javascript,Node.js,Active Directory,Ldap,我不太熟悉LDAP,但是我正在Node.js应用程序中进行身份验证,web应用程序的用户凭据将从组织的Windows域中获取 我有LDAP查找功能(使用Passport.jsNode模块),但是为了让它工作,我必须将用户的完整DN放入节点中。例如,假设: 我的FQDN是mydomain.private.net 我的用户存储在一个组织单元中,比如说staff 现在,如果我想查找userjoe,我必须将此字符串放入节点: var username = 'CN=joe,OU=staff,DC=mydo

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

我有LDAP查找功能(使用
Passport.js
Node模块),但是为了让它工作,我必须将用户的完整DN放入节点中。例如,假设:

  • 我的FQDN是
    mydomain.private.net

  • 我的用户存储在一个组织单元中,比如说
    staff

  • 现在,如果我想查找user
    joe
    ,我必须将此字符串放入节点:

    var username = 'CN=joe,OU=staff,DC=mydomain,DC=private,DC=net';
    
    我真的要记录这些吗? 如果我的用户位于两个不同的组织单元中,该怎么办?客户端浏览器不知道这一点!它只知道:

    username = 'joe';
    password = 'xxxxx';
    
    如果您尝试以管理员身份登录怎么办?默认情况下,管理员始终处于完全不同的OU中


    是否有一种方法仅通过名称而不通过其他方式引用LDAP对象?

    这是一个常见的LDAP问题。您需要从用户处获取唯一标识符,然后查找它

    通常这就是
    uid
    属性的用途。Active Directory可能有也可能没有填充,通常依赖于域内必须唯一的sAMAccountName

    所以你需要一个两步的过程

    1) 查询uid=joe或samAccountName=joe 2) 使用结果测试绑定或密码比较

    然后使用
    DC=mydomain,DC=private,DC=net
    值作为根目录进行搜索。

    (回答我自己的问题) geoffc的回答是正确的,这是适用于my Node.js应用程序的工作解决方案,使用
    activedirectory
    npm模块:

      // 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);
            }
          });  
        }
      });
    

    谢谢-不久前我终于找到了答案,但是你的回答确实指向了正确的解决方案,我在下面详细介绍了。谢谢!