使用 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
(免责声明:我是作者)执行以下操作:
- 使用
bindDn
和 bindCredentials
绑定到 LDAP 服务器,如果提供的话
- 使用定义的
searchFilter
和 searchBase
通过此管理连接搜索用户
- 如果只有一个结果 returned,尝试使用该结果和用户给定的密码进行绑定。
您没有传递管理员凭据,即。您正在尝试进行匿名搜索,如果服务器不允许匿名访问(这可能是最常见的情况),这可能是导致错误的原因。您应该定义 bindDn
(使用完整 DN 以确保安全)和 bindCredentials
。通常使用服务帐户,即。不是任何人的个人帐户。
第3步完成是因为LDAP服务器通常需要完整的DN来绑定,但即使用户知道他们的DN也不是很方便的登录用户名。这也适用于 bindDn
,尽管某些服务器确实允许使用其他形式,例如。电子邮件地址,直接。
除非只有一次使用,否则登录仍然会失败,因为您的搜索过滤器将 return 来自 LDAP 的每个对象,并且不会执行第 3 步。您将需要使用登录搜索过滤器的用户提供的用户名。例如,(samaccountname={{username}})
将搜索其用户名是尝试登录的用户提供的用户名的用户。
我在绑定到 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
(免责声明:我是作者)执行以下操作:
- 使用
bindDn
和bindCredentials
绑定到 LDAP 服务器,如果提供的话 - 使用定义的
searchFilter
和searchBase
通过此管理连接搜索用户
- 如果只有一个结果 returned,尝试使用该结果和用户给定的密码进行绑定。
您没有传递管理员凭据,即。您正在尝试进行匿名搜索,如果服务器不允许匿名访问(这可能是最常见的情况),这可能是导致错误的原因。您应该定义 bindDn
(使用完整 DN 以确保安全)和 bindCredentials
。通常使用服务帐户,即。不是任何人的个人帐户。
第3步完成是因为LDAP服务器通常需要完整的DN来绑定,但即使用户知道他们的DN也不是很方便的登录用户名。这也适用于 bindDn
,尽管某些服务器确实允许使用其他形式,例如。电子邮件地址,直接。
除非只有一次使用,否则登录仍然会失败,因为您的搜索过滤器将 return 来自 LDAP 的每个对象,并且不会执行第 3 步。您将需要使用登录搜索过滤器的用户提供的用户名。例如,(samaccountname={{username}})
将搜索其用户名是尝试登录的用户提供的用户名的用户。