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

标签 angularjs node.js express

我在使用标题中提到的工具/应用程序向 Active Directory 服务器进行身份验证时遇到问题。

我正在使用找到的测试 AD 环境 here 这是相关的代码片段,如果有人有任何建议,我将不胜感激。

目前,我得到的错误是“无效的用户名/密码”。我不确定这是 bindDn 帐户/密码还是用户在表单中输入的帐户。根据 passport-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;
},

...

服务器 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;

服务器 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 上。该网页的评论中提到了以下内容:

The issue you are seeing is due to the fact that “uid=riemann” is a member of “ou=mathemeticians”, but does not reside under that ou. His membership in that ou is established by a uniqueMember attribute on “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}})",
  }
};

关于angularjs - 使用 NodeJS、Express 和 Passport-ldapauth 进行 LDAP 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28159093/

相关文章:

mysql - 使用 "Unknown Column"和 "limit"选项时,Sequelize 出现 "include"错误

javascript - 使用 react、react-router 和 express 进行服务器端渲染

javascript - 尝试在快速路由中发送响应时安全握手失败

node.js - nodejs、socket.io 和expressjs 未连接

javascript - AngularJS 1.3.8 使用多个 Controller ,第二个 Controller 不工作

在 Angular 中对指令 Controller 进行单元测试,而不使 Controller 成为全局的

node.js - 多个路径同时匹配-奇怪的快速行为

node.js - Firebase 云函数错误 : connect ECONNREFUSED

javascript - Angularjs:找不到通过ajax调用从服务器获取的表单

javascript - "ion-scroll"- 无法垂直滚动