使用 Passport 和 node.js 的 ldap 身份验证绑定错误

bind error with ldap authentication using Passport and node.js

我在绑定到 ldap 服务器时遇到问题。我有以下代码:

在passport.js

module.exports = function() {
// Serialize sessions
passport.serializeUser(function(user, done) {
console.log('userid' + user.id)
    done(null, user.id);
});

// Deserialize sessions
passport.deserializeUser(function(id, done) {
    User.findOne({
        _id: id
    }, '-password', function(err, user) {
        done(err, user);
    });
});

passport.use(new LdapStrategy({
        usernameField:'username',
        passwordField:'password', 
        server: {
            url: 'ldap://xxx',
            //bindDn: 'AD\'+'username',
            searchFilter: '(objectclass=*)',
            searchBase: 'ou=rzuser, dc=xxx, dc=xxx, dc=xxx',
        }
    },
    return done(null, user);
    }
));
};

我已经使用以下代码在服务器端验证了 ldap 策略:

passport.authenticate('ldapauth', function(err, user, info) {

即使用户名和密码正确,我仍收到以下错误:

[OperationsError: 000004DC: LdapErr: DSID-0C0906DD, comment: In order to
perform this operation a successful bind must be completed on the 
connection., data 0, v1772].

我认为问题在于将正确的用户名传递给服务器。我的 ldap 服务器接受以域名作为用户名的用户名:domain\username。在我的例子中,域是 "AD"。所以传递的用户名应该是 "AD\username"。任何人都可以帮助我使用正确的配置将其传递给服务器吗?

passport-ldapauth(免责声明:我是作者)执行以下操作:

  1. 使用 bindDnbindCredentials 绑定到 LDAP 服务器,如果提供的话
  2. 使用定义的 searchFiltersearchBase
  3. 通过此管理连接搜索用户
  4. 如果只有一个结果 returned,尝试使用该结果和用户给定的密码进行绑定。

您没有传递管理员凭据,即。您正在尝试进行匿名搜索,如果服务器不允许匿名访问(这可能是最常见的情况),这可能是导致错误的原因。您应该定义 bindDn(使用完整 DN 以确保安全)和 bindCredentials。通常使用服务帐户,即。不是任何人的个人帐户。

第3步完成是因为LDAP服务器通常需要完整的DN来绑定,但即使用户知道他们的DN也不是很方便的登录用户名。这也适用于 bindDn,尽管某些服务器确实允许使用其他形式,例如。电子邮件地址,直接。

除非只有一次使用,否则登录仍然会失败,因为您的搜索过滤器将 return 来自 LDAP 的每个对象,并且不会执行第 3 步。您将需要使用登录搜索过滤器的用户提供的用户名。例如,(samaccountname={{username}}) 将搜索其用户名是尝试登录的用户提供的用户名的用户。