在 nodejs 中使用 ldapjs 进行 LDAP 身份验证

LDAP authentication using ldapjs in nodejs

我是 node.js 的新手,对 LDAP 身份验证有些了解。我正在尝试从搜索中检索员工 ID,但尽管传递的凭据已成功绑定,但仍获取了 none 的搜索条目,但不确定我在哪里误导了。如果有人能帮助我,那将是一个很大的帮助!

下面是代码片段的结果集:

Reader绑定成功 搜索结果长度:0 搜索 retval:{"messageID":2,"protocolOp":"LDAPResult","status":0,"matchedDN":"","errorMessage":"","referrals":[],"controls":[]} 没有要绑定的唯一用户

ldapRoute.route('/ldap').post((req, res, next) => { 

 var result = "";
  
 var email =req.body.email;

 var client = ldap.createClient({
        url: 'ldap://******'
 });

 var opts = {
  filter: '(sAMAccountName='+ email + ')',
  attributes: ['sAMAccountName']
  };
  
        
var username = 'ii' + "\" + email;
 
client.bind(username, req.body.password, function(err) {
    if (err){
  result += "Reader bind failed " + err;
    res.send(result);
    return;
 
 }
 else{
    
    result += "Reader bind succeeded\n";
 }
 
 client.search('OU=emp,dc=i,dc=ac,dc=com', opts, function(err, searchRes) {
  
 var searchList = []

 if (err) {
    result += "Search failed " + err;
    res.send(result);
    return;
 }
 
searchRes.on("searchEntry", (entry) => {
    result += "Found entry: " + entry + "\n";
    searchList.push(entry);
 
 });
 
searchRes.on("error", (err) => {
    result += "Search failed with " + err;
    res.send(result);
 
 });
 
searchRes.on("end", (retVal) => {
    result += "Search results length: " + searchList.length + "\n";
    for(var i=0; i<searchList.length; i++)
    result += "DN:" + searchList[i].employeeID + "\n";
    result += "Search retval:" + retVal + "\n";
 
  if (searchList.length == 1)   {
    client.bind(searchList[0].employeeID, req.body.password, function(err) {
      if (err)
         result += "Bind with real credential error: " + err;
      else
        result += "Bind with real credential is a success";
  
     res.send(result);
  });  // client.bind (real credential)
  
  } else { 
                        result += "No unique user to bind";
                        res.send(result);
                    }

         });  

  });  

 }); 

});

问题出在过滤器中,由于某些奇怪的原因,'end' 在点击 'searchEntry' 之前被解雇了,调试它帮助我解决了问题。

//Filter
var opts = {
 filter: '(sAMAccountName=' + email+')',
 scope: 'sub',
 attributes: ['employeeID']
 }; 

//Search
client.search('OU=empl,dc=ii,dc=ac,dc=in', opts, function(err, searchRes) 
{
   if (err) 
 {   
   result += "Search failed " + err;    
   res.send(result); 
   return;
 }else{
searchRes.on("searchEntry", (entry) => 
 {
   result += "Found entry: " + entry.object.employeeID;
   res.send(result);
 }
 / ........../
} });