使用NodeJS,Express和Passport-ldapauth进行LDAP身份验证

use*_*903 8 node.js express angularjs

我无法使用标题中提到的工具/应用程序对Active Directory服务器进行身份验证.

我正在使用此处找到的测试AD环境 以下是相关的代码片段,如果有人有任何建议我会非常感激.

目前,我得到的错误是"无效的用户名/密码".我不确定这是bindDn帐户/ pw还是用户在表单中输入的帐号.根据护照-ldapauth项目,它是:

invalidCredentials flash message for InvalidCredentialsError
NoSuchObjectError, and 
/no such user/i LDAP errors (default: 'Invalid     username/password')
Run Code Online (Sandbox Code Playgroud)

提前致谢.

客户端 - auth.service.js

...

login: function(user, callback) {
var cb = callback || angular.noop;
var deferred = $q.defer();

$http.post('/auth/ldap', {
  email: user.email,
  password: user.password
}).
success(function(data) {
  $cookieStore.put('token', data.token);
  currentUser = User.get();
  deferred.resolve(data);
  return cb();
}).
error(function(err) {
  this.logout();
  deferred.reject(err);
  return cb(err);
}.bind(this));

return deferred.promise;
},

...
Run Code Online (Sandbox Code Playgroud)

SERVER index.js

'use strict';

var express = require('express');
var passport = require('passport');
var auth = require('../auth.service');

var router = express.Router();

router.post('/', function(req, res, next) {
  passport.authenticate('ldapauth', function (err, user, info) {
    var error = err || info;
    if (error) return res.json(401, error);
    if (!user) return res.json(404, {message: 'Something went wrong, please try again.'});

    var token = auth.signToken(user._id, user.role);
    res.json({token: token});
  })(req, res, next)
});

module.exports = router;
Run Code Online (Sandbox Code Playgroud)

SERVER passport.js

var passport = require('passport');
var LdapStrategy = require('passport-ldapauth').Strategy;

exports.setup = function (User, config) {
  passport.use(new LdapStrategy({
      usernameField: 'email',
      passwordField: 'password',
      server: {
        url: 'ldap://ldap.forumsys.com:389',
        bindDn: "cn=read-only-admin,dc=example,dc=com",
        bindCredentials: "password",
        searchBase: 'ou=mathematicians,dc=example,dc=com',
        searchFilter: 'uid={{username}}'
      }
    },
    function (user, done) {  
      return done(null, user);
    }
  ));
};
Run Code Online (Sandbox Code Playgroud)

ves*_*sse 5

问题出ou=mathematicians在搜索库中。该网页上的注释中有以下提及:

您看到的问题是由于“ uid = riemann”是“ ou = mathematicians”的成员,而不是位于该ou下的事实。他在ou中的成员身份由“ ou =数学家”上的uniqueMember属性建立。

这应该工作(甚至尝试过ldapauth-fork哪些passport-ldapauth用途):

var opts = {
  server: {
    "url": "ldap://ldap.forumsys.com:389",
    "adminDn": "cn=read-only-admin,dc=example,dc=com",
    "adminPassword": "password",
    "searchBase": "dc=example,dc=com",
    "searchFilter": "(uid={{username}})",
  }
};
Run Code Online (Sandbox Code Playgroud)


rde*_*ges 1

您的代码看起来正确,但您遇到的错误让我相信您确实没有提供正确的用户名/密码!您确定使用正确的凭据进行测试吗?

作为旁注——如果您正在寻找一种更简单的方法来为一个大项目做到这一点,并且不介意花一些钱,Stormpath 的 API 服务可以为您做这样的事情:它基本上同步您的 AD / LDAP 用户进入它的 API 服务,这样您就可以通过 REST API 使用它们(这要简单得多)。

您可以使用两个库来使用它:

两者都非常简单/很好用。