ldapjs身份验证错误

时间:2014-03-10 09:00:48

标签: node.js authentication login ldap

我的公司有一个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的新手,所以这可能只是一个简单的错误,但我无法理解。请帮帮....

2 个答案:

答案 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中定位属性用户名,但您可以更改它,与搜索的oudc字段相同。

答案 1 :(得分:0)

已经过了很长时间了,但希望能对某人有所帮助。

“这是问题所在:当我输入没有密码的有效用户名或无效用户名(例如“ fjdkfjdklsjfsjd”)时,也会发送回“ login”,这是异常的。”

否,LDAP中有一个叫做“匿名”绑定的东西。这使您无需密码即可绑定。 所以为什么?。原因是要先在LDAP中进行搜索,因此需要使用BIND,因此某些人更喜欢使用匿名绑定,而不是使用专用的用户进行搜索操作。因此仅出于这个原因,应该使用匿名绑定。

重要

因此,当您使用LDAP时,您需要从开发人员一方处理空密码和空DN方案,而不是将其传递给LDAP服务器

P.S:在某些目录服务中,可以将其关闭