我在节点/快递中间件中使用 Passport 和 passport-saml 实施 SAML SSO。
定义了以下快速用户和策略:
用户
const savedUsers = [];
passport.serializeUser((expressUser, done) => {
done(null, expressUser);
});
passport.deserializeUser((expressUser, done) => {
done(null, expressUser);
});
战略
const strategy = new Strategy(
{
entryPoint: process.env.SSO_ENTRYPOINT,
issuer: process.env.SSO_ISSUER,
protocol: process.env.SSO_PROTOCOL,
logoutUrl: process.env.SSO_LOGOUT_URL,
cert: fs.readFileSync('./.cert/saml-cert.pem', 'utf-8'),
path: 'sso/callback'
},
(expressUser, done) => {
if (!savedUsers.includes(expressUser)) {
savedUsers.push(expressUser);
}
return done(null, expressUser);
}
);
SSO 工作正常。我不知道如何让 SLO 工作。已经看到了一些关于 SO 的示例:
strategy.logout(req, function(err, requestUrl) {
// LOCAL logout
req.logout();
// redirect to the IdP with the encrypted SAML logout request
res.redirect(requestUrl);
});
但这不起作用 - 部分原因是我不知道requestUrl
应该是什么,其次是如何使用 Passport logoutUrl 以及我是否需要提供其他数据。logoutUrl 是 ISP 提供的单一注销服务 URL(在我的例子中是 PingIdentity)。护照网站上的文档很少。
非常感谢任何帮助。