【问题标题】:Authenticating with Passport.js ActiveDirectory doesn't maintain session使用 Passport.js ActiveDirectory 进行身份验证不会维护会话
【发布时间】:2019-03-03 22:32:03
【问题描述】:

我在使用 ActiveDirectory 策略时遇到 Passport.js 问题,我成功地进行了身份验证,但未能在后续请求中维护会话。身份验证后,对req.isAuthenticated() 的任何调用都将返回 false。此外,客户端的浏览器上没有设置 cookie。我花了一天时间浏览类似的帖子,但到目前为止,建议的解决方案都没有奏效。

需要注意的一些观察:

-身份验证始终成功,并将 req.user 返回给客户端。

-serializeUser() 中的 console.log 始终会触发并正确记录用户记录。

-deserializeUser() 中的 console.log 永远不会触发,我不确定何时应该调用此函数,但似乎没有?

-登录后,每次我调用我的 /test 端点时,都会触发未经身份验证的条件。

// Passport Requires
const passport = require('passport');
const session = require('express-session');
var ActiveDirectoryStrategy = require('passport-activedirectory');

// Setup
app.use(session({
    secret: 'secret',
    resave: false,
    saveUninitialized: false,
    cookie: { secure: false, maxAge: 600000 }
}));

app.use(passport.initialize());
app.use(passport.session());

passport.serializeUser(function(user, done) {
    console.log('userStrategy -- serialized:', user)
    done(null, user);
});

passport.deserializeUser(function(user, done) {
    console.log('userStrategy -- deserializeUser', user)
    done(null, user);
});

passport.use(new ActiveDirectoryStrategy({ 
    integrated: false,
    passReqToCallback: true,
    ldap: {
        url: "url",
        baseDN: "baseDN",
        username: `username`,
        password: `password`
    }
}, function (req, profile, ad, done) {
    ad.isUserMemberOf(profile._json.dn, 'Access Group', function (err, isMember) {
        console.log('isMember:', isMember)
        if (err) {
            return done(err)
        } else {
            return done(null, profile)
        }
    })
}))

// Login Route
app.post('/login', 
    passport.authenticate('ActiveDirectory', { failWithError: true }), 
    function (req, res) {
        console.log('Authenticated');
        return res.status(200).send(req.user);
    }, function (err) {
        console.log('Not Authenticated');
        return res.sendStatus(401).send(err);
    }
)

// Test endpoint to check whether user is authenticated
app.get('/test', function(req, res) {
    if (req.isAuthenticated()) {
        res.send('Youre authenticated!')
    } else {
        res.send('Youre not authenticated!')
    }
})

感谢您对这个问题的任何想法——谢谢!

【问题讨论】:

    标签: node.js active-directory passport.js


    【解决方案1】:

    我发现了与 Passport 或服务器设置无关的问题。

    在我的客户端 API 调用登录中,我一直在使用 fetch(),但在初始 POST 登录时我没有 credentials: 'include' 选项。一旦我添加了这个选项,一个 cookie 就会被发送回客户端浏览器,并且未来对 isAuthenticated() 的 API 调用返回 true。

    确保在您的所有 API 调用中都有credentials: 'include',包括用于登录的初始 POST。

    【讨论】:

      猜你喜欢
      • 2016-05-29
      • 1970-01-01
      • 2019-01-29
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2015-11-22
      • 2018-05-03
      相关资源
      最近更新 更多