【问题标题】:LDAP Authentication with NodeJS, Express, and Passport-ldapauth使用 NodeJS、Express 和 Passport-ldapauth 进行 LDAP 身份验证
【发布时间】:2021-07-08 16:50:11
【问题描述】:

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

我正在使用一个测试 AD 环境,发现 here 以下是相关代码sn-ps,如果有人有任何建议,我将不胜感激。

目前,我得到的错误是“无效的用户名/密码”。我不确定这是 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;

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

【问题讨论】:

    标签: angularjs node.js express


    【解决方案1】:

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

    您看到的问题是由于“uid=riemann”是“ou=matheticians”的成员,但不属于该 ou。他在 ou 中的成员资格是由“ou=matheticians”上的 uniqueMember 属性建立的。

    这应该可以工作(即使与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}})",
      }
    };
    

    【讨论】:

      【解决方案2】:

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

      服务器端

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

      客户端

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          【解决方案4】:

          这个代码我 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

          【讨论】:

            猜你喜欢
            • 2015-08-22
            • 1970-01-01
            • 2018-01-29
            • 2020-02-01
            • 2015-05-18
            • 1970-01-01
            • 2016-08-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多