【发布时间】:2016-12-18 03:24:23
【问题描述】:
我们已经实现了 SAML SSO,我们也使用了 passport-saml。登录使用“http-post”作为 authnRequestBinding 完美运行。但我找不到任何这样的注销方法。似乎注销默认为 http 重定向,这不能正常工作。
【问题讨论】:
标签: node.js passport.js saml-2.0
我们已经实现了 SAML SSO,我们也使用了 passport-saml。登录使用“http-post”作为 authnRequestBinding 完美运行。但我找不到任何这样的注销方法。似乎注销默认为 http 重定向,这不能正常工作。
【问题讨论】:
标签: node.js passport.js saml-2.0
首先,您需要在配置中为 passport-saml 定义 logoutUrl 和 logoutCallback。 logoutUrl 是您的服务器将发送 logoutRequest 的 url。所以它是从您正在使用的身份提供者那里获得的 URL。 logoutCallback 顾名思义,是注销完成后浏览器(通过重定向)调用的 callbackUrl。以下是添加这些配置的方法:
module.exports = {
development: {
app: {
name: 'Passport SAML strategy example',
port: process.env.PORT || 8443
},
passport: {
strategy: 'saml',
saml: {
logoutUrl: 'idp-logout-url-here',
logoutCallback: 'your-logout-callback-url-here'
}
}
}
};
然后您需要在代码中的某处添加 SamlStrategy,您将在其中使用上面定义的配置。当然config也会有其他变量,我只是把logout相关的变量放在那里。
最后,您需要在您的节点应用程序中定义自己的注销路由,它会在调用时启动注销过程:
app.get('/logout', function(req, res) {
if (req.user == null) {
return res.redirect('/');
}
return SamlStrategy.logout(req, function(err, uri) {
return res.redirect(uri);
});
});
从上面可以看出,它会调用 SamlStrategy 中定义的注销函数。所以在passport-saml策略中定义了一个注销功能。和上面一样,你需要给它一个回调函数,然后它将响应重定向到 uri。 uri 将是您之前定义的 logoutCallback url。
如果您想知道那里的 SamlStrategy 是什么,它实际上是 passport-saml 的策略。我可以告诉你如何让它工作。例如,在一个名为“saml-strategy.js”的单独文件中,输入以下内容:
const SamlStrategy = require('passport-saml').Strategy;
var config = require('./config.js')['development'];
module.exports = new SamlStrategy(
{
otherImportantvariable1: config.passport.saml.OtherImportantvariable1,
logoutUrl: config.passport.saml.logoutUrl,
logoutCallback: config.passport.saml.logoutCallback
}
function (profile, done) {
user = Object.assign({}, profile);
return done(null, user);
}
);
以与上面定义的注销相关变量相同的方式插入所有重要的配置变量。包括在第一步中创建的配置。
然后你可以只需要 SamlStrategy 到你有你的路线的同一个文件:
const SamlStrategy = require('../config/saml-strategy');
如有不清楚的地方请追问!
【讨论】:
ADFS 的注销修复如下,
1) 应将会话索引属性添加为 passport-saml 注销请求的一部分。您可以从护照个人资料对象中获取。
function (profile, done) {
console.log('Profile: %j', profile);
return done(null,
{
id: profile.nameID,
sessionIndex: profile.sessionIndex
});
如果没有从 ADFS 返回 sessionIndex。那么,依赖部分信任中的NameID规则应该如下,
将 NameID 添加为“Claim rule name”,选择“Active Directory”作为 Attribute store,选择“SAM-Account-Name”作为 LDAP Attribute,选择“Name ID”作为“Outgoing claim type”,完成向导并确认声明规则窗口。 (参考:spring saml ADFS)
2) 使用 ADFS 日志(事件查看器)进行调试,并检查您的错误是否类似于以下错误,
SAML Single Logout 请求与登录不对应 会话参与者。请求者:app.yyy.com
请求名称标识符: 格式:urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified, NameQualifier: SPNameQualifier: , SPProvidedId: 登录会话 参与者:人数:1,[发行人:app.yyy.com,姓名ID:(格式:, NameQualifier: SPNameQualifier: , SPProvidedId: )]此请求失败。
如果是,则表示 nameIDFormat 应留空以退出会话。以前我使用的是为身份验证请求指定的 nameIDFormat,但它不起作用。
没有这个配置,HTTP-POST 绑定没有任何区别。
希望这会有所帮助!
【讨论】: