如何使用passport-saml实现Azure AD的SAML单点登出功能
passport-saml对接Azure AD SAML单点登出实现方案
1. 配置项对应关系说明
- passport-saml配置里的
logoutUrl:填Azure AD提供的SAML登出端点,可从Azure AD企业应用的「单一登录」->「SAML配置」模块获取,格式通常为https://login.microsoftonline.com/<租户ID>/saml2,是后端发起登出请求时调用的Azure侧接口地址。 - Azure后台配置的「前端登出URL」:对应passport-saml配置里的
logoutCallbackUrl,是Azure AD完成登出流程后跳转回应用的回调地址,需要提前添加到Azure AD应用的重定向URI列表中,类型选择Web。
2. 补充passport-saml策略配置
在原有SAML策略配置基础上新增登出相关参数:
const SamlStrategy = require('passport-saml').Strategy; passport.use(new SamlStrategy({ // 原有登录配置保持不变:entryPoint、issuer、callbackUrl、cert等 // 新增登出配置 logoutUrl: 'https://login.microsoftonline.com/<替换为你的Azure租户ID>/saml2', logoutCallbackUrl: 'https://<替换为你的应用域名>/logout/callback', issuer: '<替换为你的应用实体ID,和登录配置保持一致>' }, (profile, done) => { // 原有用户信息校验逻辑保持不变 }));
3. /movelogout登出触发路由实现
用户点击登出时调用该路由,先销毁应用本地会话,再生成Azure AD登出请求跳转:
app.get('/movelogout', (req, res, next) => { if (!req.user) { return res.redirect('/'); } // 销毁本地会话 req.session.destroy(err => { if (err) return next(err); req.logout(err => { if (err) return next(err); // 生成Azure AD登出重定向地址 passport._strategy('saml').logout({ user: { nameID: req.user.nameID, nameIDFormat: req.user.nameIDFormat } }, (err, requestUrl) => { if (err) return next(err); res.redirect(requestUrl); }); }); }); });
4. 登出回调路由实现
Azure AD完成登出后会跳转至该地址,处理后续跳转逻辑:
// 路由地址和passport配置的logoutCallbackUrl、Azure后台填的前端登出URL完全一致 app.get('/logout/callback', (req, res) => { // 可选:校验返回的SAML请求签名合法性 res.redirect('/login?logout=success'); });
注意事项
- 所有涉及的回调地址必须保证协议、域名、路径完全匹配,否则Azure AD会拒绝登出请求
- 如果需要支持跨应用单点登出(其他关联应用登出时Azure主动通知本应用销毁会话),可额外新增POST类型的登出回调路由,接收Azure推送的SAML登出请求后销毁对应用户会话即可
内容的提问来源于stack exchange,提问作者Rajan
相关产品推荐
相关产品推荐

