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

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

我在这里使用的testingAD环境下面是相关的代码片段,如果有人有任何build议,我会很感激。

目前,我收到的错误是“无效的用户名/密码”。 我不确定这是bindDn帐户/ pw还是用户在表单中input的。 根据护照ldapauth项目是这样的:

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

问题是ou=mathematicians在search基地。 在该网页的评论中有以下提及:

你所看到的问题是由于“uid = riemann”是“ou = mathemeticians”的成员,但不在此之下。 他的成员是“ou = mathemeticians”上的一个独特的成员属性。

这应该工作(即使使用passport-ldapauth使用ldapauth-fork ):

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

你的代码看起来是正确的,但是你得到的错误让我相信你真的没有提供正确的用户名/密码! 你确定你正在testing正确的凭据?

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

有两个库可以用来处理它:

  • EXPRESS-stormpath
  • 护照stormpath

两者都很简单/很好用。