如何在passport-saml的SP中获取samltest.id的「不记住登录」自定义断言?
基于passport-saml获取samltest.id「Don't remember login」偏好的方案
1. 先确认IDP是否返回该属性
passport-saml默认的profile对象仅提取标准SAML属性,可能未包含「Don't remember login」的偏好设置。你可以在回调函数中打印完整的SAML响应数据,验证IDP是否返回了对应属性:
function(request, profile, done) { // 打印原始SAML响应内容 console.log('原始SAML响应:', request.body.SAMLResponse); // 打印解析后的完整断言(若存在) console.log('解析后的断言数据:', profile._raw || '无原始断言'); // 原有业务代码... }
拿到原始SAML响应后,可通过SAML解码工具解析,查看断言中的属性声明,确认是否存在对应「不记住登录」的属性(比如rememberMe或特定OID标识的属性)。
2. 配置passport-saml提取自定义属性
如果IDP确实返回了该属性,需在SamlStrategy的配置中添加属性映射,让passport-saml将其提取到profile对象中:
const samlStrategy = new SamlStrategy( { // 原有配置项... // 映射IDP返回的自定义属性到profile attributeMap: { 'rememberMe': 'rememberMe' // 替换为IDP实际返回的属性名 } }, // 回调函数... );
配置完成后,即可在回调的profile对象中通过profile.rememberMe获取用户的偏好设置(通常false表示用户选择了「Don't remember login」)。
3. 实现「不记住登录」的会话控制
拿到用户偏好后,将其存储到本地会话或用户数据库中。下次用户发起认证请求时,动态设置forceAuthn参数为true,强制IDP重新认证:
app.get('/login', (req, res, next) => { // 从会话或数据库获取用户的「不记住登录」偏好 const forceReAuth = req.session?.user?.rememberMe === false; passport.authenticate('saml', { forceAuthn: forceReAuth })(req, res, next); });
4. 额外说明
- samltest.id默认可能未开启该属性的输出,你需要登录samltest.id平台,找到对应的SP配置条目,编辑属性请求列表,添加「rememberMe」或对应的属性OID,确保IDP会返回该属性。
- 若IDP无法返回该属性,可退而求其次在SP端处理:当用户选择「不记住登录」时,SP不创建持久会话,将会话过期时间设置为浏览器关闭即失效。
内容的提问来源于stack exchange,提问作者fenris
相关产品推荐
相关产品推荐

