2

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

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

  1. 我的 FQDN 是mydomain.private.net.

  2. 我的用户存储在一个组织单位中,比如说staff.

现在,如果我想查找 user joe,我必须把这个字符串放到 Node 中:

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

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

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

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

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

有没有办法只通过名称来引用 LDAP 对象,而不是别的?

4

2 回答 2

2

这是一个一般的 LDAP 问题。你需要从用户那里得到一个唯一的标识符,然后去寻找它。

通常,这就是该uid属性的用途。Active Directory 可能填充也可能不填充,并且通常依赖于在域中必须是唯一的 sAMAccountName。

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

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

然后,您将使用该DC=mydomain,DC=private,DC=net值作为搜索的根。

于 2013-10-21T02:00:33.667 回答
1

(回答我自己的问题)

geoffc 的回答是正确的,这是使用activedirectorynpm 模块适用于我的 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);
        }
      });  
    }
  });
于 2013-10-21T16:59:55.820 回答