当前,我正在我们的NodeJS应用程序中从事护照护照的实施。 这样做的原因是使我们的客户可以连接到他们的AD FS系统并利用SingleSignOn(SSO)。
由于我们还希望提供注销功能,因此我正在研究该逻辑。但是,我似乎无法使这个简单的功能起作用。我已经在Google上搜索了很多,尝试了许多变体和配置,但不幸的是,它不起作用。
我希望为我们的客户提供同时受SP和IdP驱动的SingleLogOut(SLO)的可能性。这是我的出发点。在调试和开发过程中,我已经退后一步,尝试终止本地会话,但看来这是不可能的。
这是我为SAML配置的路由中的相关代码:
const isAuthenticated = (req,res,next) => {
if (req.isAuthenticated()) {
// User logged in,pass on to next middleware
console.info('User authenticated');
return next();
}
// User not logged in,redirect to login page
console.info('User not authenticated');
return res.redirect('/login');
};
// GET-routes
app.get('/',isAuthenticated,(req,res) => {
res.send('Authenticated');
});
app.get('/login',passport.authenticate('saml',{
successRedirect: '/',failureRedirect: '/login/fail',}));
app.get('/logout',res) => {
passport._strategy('saml').logout(req,(err,url) => {
return res.redirect(url);
});
});
// POST-routes
app.post('/adfs/callback',next) => {
passport.authenticate('saml',user) => {
// If error occurred redirect to failure URL
if (err) return res.redirect('/login/fail');
// If no user could be found,redirect to failure URL
if (!user) return res.redirect('/login/fail');
// User found,handle registration of user on request
req.logIn(user,(loginErr) => {
if (loginErr) return res.status(400).send(err);
// Request session set,put in store
store.set(req.sessionID,req.session,(storeErr) => {
if (storeErr) return res.status(400).send(storeErr);
return res.redirect('/');
});
});
})(req,next);
});
app.post('/logout/callback',res) => {
// Destroy session and cookie
store.destroy(req.sessionID,async (err) => {
req.logout();
return res.redirect('/');
});
});
可以看出,我控制了会话存储的处理(设置和销毁会话,但是如果这样做不明智,请告知)。 实现的会话存储是MemoryStore(https://www.npmjs.com/package/memorystore)。
发生的事情是,当用户登录时,一切正常。 然后将请求发送到路由/登出,并且发生了一些事情,我可以看到会话发生了变化,会话ID发生了更改,以及passport-saml的相关参数(nameID,sessionIndex),然后将用户重新路由到了'/ '。
但是,随后该用户被视为未通过身份验证,并被重新路由到'/ login'。有人会说它到此为止,因为必须重新输入凭据。 情况并非如此,因为用户可以直接登录而无需重新输入凭据,而且我不知道如何防止这种情况。
我确实希望任何人都知道发生了什么事:) 如果需要其他信息,我很高兴听到。