我的公司有一个ldap服务器,我尝试使用带有ldapjs模块的nodejs测试ldap连接,我只是想在第一个地方测试连接,所以不包括搜索功能。
这是代码:
exports.authenticate = function(req, res){
var ldap = require('ldapjs');
var username = req.body.username;
var password = req.body.password;
var client = ldap.createClient({
url: 'LDAP://192.168.3.220/'
});
client.bind(username, password, function (err) {
if(err){
res.send(err);
}else{
res.send('login');
});
};
当我输入正确的用户名和密码时,它会发回“login”,这是预期的。 当我输入正确的用户名但密码错误时,它会发回错误的对象,这也是预期的。
这是问题所在: 当我输入有效的用户名或无效的用户名(如“fjdkfjdklsjfsjd”)而没有密码时,它也会发回“登录”,这是异常的。
我是ldap和ldapjs的新手,所以这可能只是一个简单的错误,但我无法理解。请帮帮....
答案 0 :(得分:2)
对于绑定,您需要传递与LDAP中的条目关联的dn和密码,而不是直接传递用户名/密码。
因此,进行基本的匿名搜索,从结果中获取dn,然后尝试使用该dn和用户输入的密码进行绑定。
var ldapres = null
var opts = {
filter: '(username='+ username +')',
scope: 'sub',
}
client.search('ou=people,dc=company,dc=com', opts, function (err, result) {
result.on('searchEntry', function (entry) {
ldapres = entry.raw
})
result.on('end', function (result) {
if (!ldapres) { return res.send('Invalid username') }
client.bind(ldapres.dn, password, function (err) {
if (err) { return res.send('Wrong password') }
res.send('You are logged')
})
})
})
我假设您要在LDAP中定位属性用户名,但您可以更改它,与搜索的ou
和dc
字段相同。
答案 1 :(得分:0)
已经过了很长时间了,但希望能对某人有所帮助。
“这是问题所在:当我输入没有密码的有效用户名或无效用户名(例如“ fjdkfjdklsjfsjd”)时,也会发送回“ login”,这是异常的。”
否,LDAP中有一个叫做“匿名”绑定的东西。这使您无需密码即可绑定。 所以为什么?。原因是要先在LDAP中进行搜索,因此需要使用BIND,因此某些人更喜欢使用匿名绑定,而不是使用专用的用户进行搜索操作。因此仅出于这个原因,应该使用匿名绑定。
重要
因此,当您使用LDAP时,您需要从开发人员一方处理空密码和空DN方案,而不是将其传递给LDAP服务器
P.S:在某些目录服务中,可以将其关闭