Аутентификация Active Directory с помощью NodeJS - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь создать один сервер NodeJS и планирую использовать Microsoft Active Directory организации для аутентификации.

Я пробовал то же самое со многими пакетами (activedirectory, activedirectory2, ldapjs и т. Д.)

Но ни один из них, похоже, не работает для меня.

Я предоставляю URL-адрес LDAP, и ниже указан мой код.

var ldapjs = require('ldapjs');

var config = { url: 'ldap://mycompany.com/dc=mycompany,dc=com'
           ,timeout: 10
           ,reconnect: {
              "initialDelay": 100,
              "maxDelay": 500,
              "failAfter": 5
              } 
        }

var username = "user_id@mycompany.com";
var password="password";

const ldapClient = ldapjs.createClient(config);


ldapClient.bind(username, password, function (err) {
console.log("Logging data...");
ldapClient.search('dc=mycompany,dc=com', function (err, search) {
 if (err) {
    console.log('ERROR: ' +JSON.stringify(err));
    return;
  }
search.on('searchEntry', function (err,entry) {
   if (err) {
    console.log('ERROR: ' +JSON.stringify(err));
    return;
  }
  else{
    var user = entry.object;
    console.log("Done.");
    return;
   }

   });
  });
});

Иногда это работает, но в большинстве случаев я продолжаю получать следующую ошибку (может быть, когда она выбираетдругой IP)

Error: connect ETIMEDOUT <ip address>:389
at Object.exports._errnoException (util.js:1018:11)
at exports._exceptionWithHostPort (util.js:1041:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1090:14)

Что меня озадачивает;если я пытаюсь использовать тот же URL-адрес LDAP в моем приложении C #, он работает нормально.

Есть ли разница в том, как приложение .Net использует его, по сравнению с тем, как NodeJS использует?

Могу ли я каким-то образом изменить свой код, чтобы он работал?

Ответы [ 3 ]

0 голосов
/ 05 марта 2019

Я получил это, сначала получив имя пользователя, который сделал запрос, с помощью npm: express-ntlm .Затем, используя эту информацию, я использую npm: activedirectory , чтобы запросить данные этого пользователя в Active Directory.

app.use(
  ntlm({
    domain: process.env.DOMAIN,
    domaincontroller: process.env.DOMAINCONTROLLER
  })
);

...

app.use("/", authenticate, require("./routes/index"));

Внутри своего промежуточного программного обеспечения для аутентификации у меня теперь есть доступ к req.ntlm, который содержит

{ DomainName: '...',
  UserName: '...',
  Workstation: '...',
  Authenticated: true }

Я настраиваю объект ActiveDirectory и отмечаю «bindDN» и «bindCredentials» вместо «username» и «password»:

var ad = new ActiveDirectory({
  url: process.env.DOMAINCONTROLLER,
  baseDN: process.env.BASEDN,
  bindDN: process.env.USERNAME,
  bindCredentials: process.env.PASSWORD
});

Затем вы можете использовать рекламный объект, как вдокументация npm: activedirectory:

ad.findUser(req.ntlm.UserName, (err, adUser) => {
    ...
});

findUser возвращает такие вещи, как имя и фамилия, адрес электронной почты, и это все, что мне нужно, но вы можете легко просматривать группы.

0 голосов
/ 13 июля 2019

Я подозреваю, что вы испытываете тот факт, что активный каталог (AD) высокодоступен, и не всегда 100% контроллеров домена находятся в сети.Кажется, у C # есть какой-то метод обнаружения, который, возможно, не подключен к сети?

У меня были аналогичные случаи при использовании имени HA для домена, которое выглядит так, как вы.

В этих случаях этопомогает поговорить с администратором AD и получить сервер AD, который должен обслуживать сайт, на котором находятся ваши серверы, и напрямую связаться с ним через IP-адрес или DNS.

Надеюсь, это поможет.

0 голосов
/ 27 сентября 2018

Объект конфигурации указывает время ожидания 10 миллисекунд.Это кажется довольно коротким.Собирались ли вы на 10-секундный перерыв?

Документация JS

Используете ли вы объект LdapConnection.Timeout в C #?Это ожидает секунд.

C # Документация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...