Вопрос по authentication, ldap, node.js – Узел JS LDAP Auth User

12

Я создаю страницу аутентификации при входе, где пользователь вводит имя пользователя и пароль в активном каталоге, и с помощью NodeJS я проверяю, нет лиЭто верно, но я продолжаю получать

[Error: LDAP Error Bad search filter]

или же

[Error: Search returned != 1 results]

Когда я'Я пытаюсь найти имя пользователя и пароль, мой код указан ниже:

м с помощью:https://github.com/jeremycx/node-LDAP, позволять'говорят, что пользователь ввел имя пользователя hhill

    var ldap = require('LDAP');
    var ldapServer = new ldap({ uri: 'ldap://batman.lan', version: 3});

    ldapServer.open(function(error) {
        if(error) {
           throw new Error('Cant not connect');
        } else {
            console.log('---- connected to ldap ----');

            username = '(cn='+username+')';
            ldapServer.findandbind({
                base: 'ou=users,ou=compton,dc=batman,dc=lan',
                filter: username,
                password: password
            }, function(error, data) {
                if(error){
                    console.log(error);
                } else {
                    console.log('---- verified user ----');
                }
            });
        }
    });

Есть ли у кого-нибудь предложения о том, что яя делаю неправильно?

ОБНОВИТЬ

Вот решение, которое я придумал, если кому-то когда-нибудь понадобится, с помощью ответа ниже

    var username = request.param('username');
    var password = request.param('password');

    var ldap = require('ldapjs');
    ldap.Attribute.settings.guid_format = ldap.GUID_FORMAT_B;
    var client = ldap.createClient({
          url: 'ldap://batman.com/cn='+username+', ou=users, ou=compton, dc=batman, dc=com',
          timeout: 5000,
          connectTimeout: 10000
    });
    var opts = {
      filter: '(&(objectclass=user)(samaccountname='+username+'))',
      scope: 'sub',
      attributes: ['objectGUID']
    };

    console.log('--- going to try to connect user ---');

    try {
        client.bind(username, password, function (error) {
            if(error){
                console.log(error.message);
                client.unbind(function(error) {if(error){console.log(error.message);} else{console.log('client disconnected');}});
            } else {
                console.log('connected');
                client.search('ou=users, ou=compton, dc=batman, dc=com', opts, function(error, search) {
                    console.log('Searching.....');

                    search.on('searchEntry', function(entry) {
                        if(entry.object){
                            console.log('entry: %j ' + JSON.stringify(entry.object));
                        }
                    });

                    search.on('error', function(error) {
                        console.error('error: ' + error.message);
                    });

                    client.unbind(function(error) {if(error){console.log(error.message);} else{console.log('client disconnected');}});
                });
            }
        });
    } catch(error){
        console.log(error);
        client.unbind(function(error) {if(error){console.log(error.message);} else{console.log('client disconnected');}});
    }
В первом случае, какой фильтр фактически передается на сервер? Во втором случае более чем один объект соответствует параметрам поиска: возможно, он ожидает только одно совпадение. Terry Gardner

Ваш Ответ

2   ответа
7

@Sukh Спасибо за размещение вашего решения ОБНОВЛЕНИЕ; однако существует проблема с кодом, который вы разместили в своем ОБНОВЛЕНИИ. что это работает для простых случаев, с более крупными запросами, вы обнаружите, что не связываете, прежде чем результаты будут выведены. Решением для меня было перенести ваши привязки в функции search.on.

Вот редактирование вашего ОБНОВЛЕНИЯ:

var ldap = require('ldapjs');
ldap.Attribute.settings.guid_format = ldap.GUID_FORMAT_B;
var client = ldap.createClient({
      url: 'ldap://batman.com/cn='+username+', ou=users, ou=compton, dc=batman, dc=com',
      timeout: 5000,
      connectTimeout: 10000
});
var opts = {
  filter: '(&(objectclass=user)(samaccountname='+username+'))',
  scope: 'sub',
  //attributes: ['objectGUID']
  // This attribute list is what broke your solution
  attributes: ['objectGUID','sAMAccountName','cn','mail','manager','memberOf']
};

console.log('--- going to try to connect user ---');

try {
    client.bind(username, password, function (error) {
        if(error){
            console.log(error.message);
            client.unbind(function(error) {if(error){console.log(error.message);} else{console.log('client disconnected');}});
        } else {
            console.log('connected');
            client.search('ou=users, ou=compton, dc=batman, dc=com', opts, function(error, search) {
                console.log('Searching.....');

                search.on('searchEntry', function(entry) {
                    if(entry.object){
                        console.log('entry: %j ' + JSON.stringify(entry.object));
                    }
                    client.unbind(function(error) {if(error){console.log(error.message);} else{console.log('client disconnected');}});
                });

                search.on('error', function(error) {
                    console.error('error: ' + error.message);
                    client.unbind(function(error) {if(error){console.log(error.message);} else{console.log('client disconnected');}});
                });

                // don't do this here
                //client.unbind(function(error) {if(error){console.log(error.message);} else{console.log('client disconnected');}});
            });
        }
    });
} catch(error){
    console.log(error);
    client.unbind(function(error) {if(error){console.log(error.message);} else{console.log('client disconnected');}});
}

По крайней мере, это то, что я обнаружил при использовании вашего решения с поиском в Active Directory. memberOf возвращает МНОЖЕСТВО записей в моем случае использования, и открепления выполнялись преждевременно, поэтому я получил следующую ошибку:

error: 1__ldap://my.domain.com/,OU=Employees,OU=Accounts,DC=my,DC=domain,DC=com closed
client disconnected
10

В этом случае вам нужноldapClient скорее, чемldapServerэто пример кода от официальногоDoc: Я

var ldap = require('ldapjs');

ldap.Attribute.settings.guid_format = ldap.GUID_FORMAT_B;

var client = ldap.createClient({
  url: 'ldap://127.0.0.1/CN=test,OU=Development,DC=Home'
});

var opts = {
  filter: '(objectclass=user)',
  scope: 'sub',
  attributes: ['objectGUID']
};

client.bind('username', 'password', function (err) {
  client.search('CN=test,OU=Development,DC=Home', opts, function (err, search) {
    search.on('searchEntry', function (entry) {
      var user = entry.object;
      console.log(user.objectGUID);
    });
  });
});
Просто исправлены проблемы, которые у меня были с использованием этого решения. Спасибо @zsong! Cory Collier
пробовав выше, я получаю следующую ошибку oSuchObjectError: 0000208D: NameErr: DSID-0310020A, проблема 2001 (NO_OBJECT), данные 0, лучшее соответствие: 'OU = Users, OU = NewYork, DC = basingloc, DC = LAN» Он подключается, но поиск не удается. на линии search.on @sza Sukh

Похожие вопросы