我有问题绑定到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服务器接受域名为username:domain \ username的用户名。在我的情况下,域名是" AD"。所以传递的用户名应为" AD \ username"。任何机构都可以帮我使用正确的配置将其传递给服务器吗?
答案 0 :(得分:3)
bindDn
(免责声明:我是作者)执行以下操作:
bindCredentials
和searchFilter
绑定到LDAP服务器(如果提供)searchBase
和bindDn
您没有传递管理员凭据,即。您尝试进行匿名搜索,如果服务器不允许匿名访问(这可能是最常见的情况),那么这可能是导致错误的原因。您应该定义bindCredentials
(使用完整DN以确保安全)和bindDn
。通常使用服务帐户,即。不是个人账户的东西。
完成第3步是因为LDAP服务器通常需要完整的DN来绑定,但即使用户知道他们的DN,也不是非常方便的登录用户名。这也适用于(samaccountname={{username}})
,尽管某些服务器允许使用其他形式,例如。电子邮件地址,直接。
登录仍然会失败,除非只有一次使用,因为您的搜索过滤器将从LDAP返回每个对象,并且不会执行步骤3。您需要使用登录搜索过滤器的用户提供的用户名。例如,{{1}}将搜索用户名是用户尝试登录时提供的用户。