我们已经实施了SAML SSO,我们也使用了passport-saml。登录完全使用“http-post”作为authnRequestBinding.But我无法找到任何这样的注销方法。它显示注销默认为http重定向,这不能正常工作。
答案 0 :(得分:3)
首先,您需要在passport-saml的配置中定义 logoutUrl 和 logoutCallback 。 logoutUrl是服务器将发送logoutRequest的URL。所以它是从您正在使用的身份提供者获取的URL。 logoutCallback就像名称所示,callbackUrl将在注销完成后由浏览器调用(通过重定向)。以下是添加这些配置的方法:
<style name="AppTheme.CardView" parent="CardView">
<item name="cardBackgroundColor">@android:color/white</item>
<item name="cardCornerRadius">4dp</item>
<item name="cardElevation">2dp</item>
<item name="cardMaxElevation">2dp</item>
<item name="cardUseCompatPadding">false</item>
<item name="cardPreventCornerOverlap">true</item>
</style>
然后,您需要在代码中的某处使用 SamlStrategy ,您将使用上面定义的配置。当然配置也会有其他变量,我现在就把logout相关变量放在那里。
最后,您需要在节点应用程序中定义自己的注销路径,这将在调用时启动注销过程:
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中定义的注销功能。因此,在passport-saml策略中定义了注销功能。如上所述,您需要为其提供一个回调函数,然后将响应重定向到uri。 uri 将是您之前定义的logoutCallback网址。
如果你想知道SamlStrategy在那里是什么,它实际上是护照-saml的策略。我可以告诉你如何使它工作。在一个名为'saml-strategy.js'的单独文件中,输入:
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到你的路线所在的同一个文件:
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);
}
);
请询问是否有任何不清楚的地方!
答案 1 :(得分:1)
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添加为“声明规则名称”,选择“Active Directory”作为属性存储,选择“SAM-Account-Name”作为LDAP属性,选择“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,NameID :(格式:, NameQualifier:SPNameQualifier:,SPProvidedId:)]此请求失败。
如果是,则表示nameIDFormat应为空,以便注销会话。以前我使用的是为身份验证请求指定的nameIDFormat,但它不起作用。
如果没有此配置,HTTP-POST绑定没有任何区别。
希望这有帮助!