使用Http-post方法在passport-saml中实现注销功能

时间:2016-08-11 11:47:13

标签: node.js passport.js saml-2.0

我们已经实施了SAML SSO,我们也使用了passport-saml。登录完全使用“http-post”作为authnRequestBinding.But我无法找到任何这样的注销方法。它显示注销默认为http重定向,这不能正常工作。

2 个答案:

答案 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绑定没有任何区别。

希望这有帮助!