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

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

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

#1楼 票数:5

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

您看到的问题是由于“uid=riemann”是“ou=mathemeticians”的成员,但不属于该 ou。 他在那个 ou 中的成员资格是通过“ou=mathemeticians”上的 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楼 票数:2

对于仍然迷失方向的人,这是我在 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)
})

客户端

邮递员示例

#3楼 票数:1

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

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

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

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

#4楼 票数: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);

在此处输入图片说明

  ask by user1554903 translate from so

未解决问题?本站智能推荐:

1回复

在Node.js上使用passport-ldapauth进行LDAP身份验证

我一直在与护照-ldapauth挣扎了几天,而且我没有更多的想法,我做错了什么。 简而言之,我有一个使用两种护照策略的项目:本地和LDAP。 本地策略对我来说非常适合,但LDAP是有问题的。 我有一个AD的只读用户(让我们称之为“ldap-read-only-admin”),我可以
1回复

使用Express / Passport进行身份验证和路由,AngularJS和ensureLoggedIn不使用“/”url

我有一个使用Yeoman Generator Angular Fullstack生成器生成的MEAN堆栈应用程序。 您应该只能通过登录访问该站点。 EnsureLoggedIn的回购就在这里 注销后,如果我尝试导航到'/ products',我会被重定向到'/ login'就好了。
1回复

Express / Angular,在Passport身份验证后不重定向

在Express中,我正在使用: 在Angular $ routeProvider中: 当我使用社交登录进行Meetup /auth/meetup它会进行身份验证,但不会按照成功重定向护照中的指定重新路由到/profile/meetup : 当我单击带有href="/au
1回复

来自Appgyver Supersonic Mobile App的Express / Nodejs身份验证

我的无知正照耀着这个。 我有一个使用MEAN堆栈(Mongo,Express,Angularjs,Nodejs)的Web应用程序,其中一些功能在移动设备上表现欠佳。 因此,我正在Appgyver Supersonic平台上开发该应用程序的移动版本。 Appgyver框架基于Angularj
2回复

在mongo,node,passport和heroku上对用户进行身份验证。 几天后停止工作

我正在使用mongo,express,angular和node创建我的第一个全栈Web应用程序。 我来自前端背景,在身份验证实现方面有些挣扎。 我的(不完整的)应用程序工作了好几天,但今天它突然坏了,然后我神奇地修复了它。 我很确定我没有更改代码中的任何麻烦内容。 该错误导致所有经过
1回复

如果用户未在express.js中进行身份验证,如何通过put方法重定向到登录页面?

我想使用$ http.put方法从angularjs页面更新数据库。 但是,如果会话过期,它会在服务器上向我显示这些内容。 在此路线上放置方法命中 未通过身份验证后重定向到此页面。 问题是,它不会转到登录页面,而是停留在同一页面上。 重定向它应该是GET / admin
2回复

Express.js和Angular-身份验证和登录会话

我正在为应用程序使用expressjs和angularjs。 基本上,expressjs仅返回一个具有角单页应用程序的.html。 所有路由都使用angularjs完成,而expressjs仅公开一些Web服务(GET,POST)。 因此,如果我只做一个常规的expressjs应用程序
1回复

Passport身份验证成功,但未重定向并给出500错误

我正在通过制作诸如twitter之类的社交媒体网络应用来学习平均堆栈,但是在注册或登录时我获得了成功,并且还在数据库中创建了一个用户,但该页面未重定向并给出错误500 以下是代码 App.js authenticate.js var express = require(