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

时间:2015-01-26 21:29:03

标签: angularjs node.js express

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

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

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

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

提前致谢。

客户 - 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;
},

...

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;

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);
    }
  ));
};

4 个答案:

答案 0 :(得分:5)

问题在于搜索库中的ou=mathematicians。该网页的评论中提到了以下内容:

  

您所看到的问题是由于“uid = riemann”是“ou = mathemeticians”的成员,但不属于该ou。他的成员资格是由“ou = mathemeticians”的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}})",
  }
};

答案 1 :(得分:2)

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

作为旁注 - 如果你正在为一个大项目寻找一种更简单的方法来做这件事,并且不介意花一些钱,Stormpath's API service会为你做这样的事情:它基本上是同步的您的AD / LDAP用户使用它的API服务,因此您可以通过REST API使用它们(它更简单)。

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

两者都很简单/很好用。

答案 2 :(得分:1)

对于那些仍然迷路的人,这是我在Typescript中的代码段。

服务器端

import * as express from 'express'
import * as bodyParser from 'body-parser'
import * as cors from 'cors'
import * as passport from 'passport'
import * as ldapstrategy from 'passport-ldapauth'

// connect to LDAP server
const OPTS: ldapstrategy.Options = {
  server: {
    url: "ldap://ldap.forumsys.com",
    bindDN: "cn=read-only-admin,dc=example,dc=com",
    bindCredentials: 'password',
    searchBase: "dc=example,dc=com",
    searchFilter: "(uid={{username}})"
  }
}

passport.use(new ldapstrategy(OPTS))

// instantiate the server
const app = express()
// parse the request data automatically
app.use(bodyParser.json())
// allow cross origin resource sharing
app.use(cors())
// inject LDAP connection to express server
app.use(passport.initialize())

// listen to port defined
const port = process.env.PORT || 8085
app.listen(port, (): void => {
  console.log(`Listening on port ${port}`)
})

app.post('/login', (req: express.Request, res: express.Response, next: express.NextFunction): void | Response => {
  passport.authenticate('ldapauth', (err, user, info): void => {
    var error = err || info
    if (error) 
      res.send({
        status: 500,
        data: error
      })
    if (!user) 
      res.send({
        status: 404,
        data: "User Not Found"
      })
    else
      res.send({
        status: 200,
        data: user
      })
  })(req, res, next)
})

客户端

Postman Example

答案 3 :(得分:0)

这个代码我 phpLDAPadmin express.js 和passport-ldapauth

var express      = require('express'),
    passport     = require('passport'),
    LdapStrategy = require('passport-ldapauth');
    

const OPTS = {
  server: {
    url: 'ldap://localhost:389',
    bindDN: 'cn=admin,dc=ramhlocal,dc=com',
    bindCredentials: 'password',
    searchBase: 'dc=ramhlocal,dc=com',
    searchFilter: '(uid={{username}})'
  }
};

var app = express();

passport.use(new LdapStrategy(OPTS));

app.use(express.json());
app.use(express.urlencoded({extended: false}));
app.use(passport.initialize());


app.post('/login', function (req, res, next){
  passport.authenticate('ldapauth', {session: false}, function(err, user, info) {
    var error = err || info
    console.log(user);
    if (error) 
      res.send({
        status: 500,
        data: error
      })
    if (! user) {
      res.send({
        status: 404,
        data: "User Not Found"
      })
    }
    res.send({
      status: 200,
      data: user
    })
  })(req, res,next)
})
app.listen(8080);

enter image description here