【问题标题】:implementing a logout functionality in passport-saml using Http-post method使用Http-post方法在passport-saml中实现注销功能
【发布时间】:2016-12-18 03:24:23
【问题描述】:

我们已经实现了 SAML SSO,我们也使用了 passport-saml。登录使用“http-post”作为 authnRequestBinding 完美运行。但我找不到任何这样的注销方法。似乎注销默认为 http 重定向,这不能正常工作。

【问题讨论】:

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


    【解决方案1】:

    首先,您需要在配置中为 passport-saml 定义 logoutUrllogoutCallback。 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');
    

    如有不清楚的地方请追问!

    【讨论】:

    • 这是通过重定向执行 SLO,这明确是问题要求不要执行的操作。
    • 没错,但他说这对他来说不能正常工作。为此,我提供了一种正确配置它的方法。
    • 我在我的配置数据中添加 logoutCallbackUrl。但它没有反映在元数据生成中。
    【解决方案2】:

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

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2014-07-02
      • 1970-01-01
      • 2017-10-23
      • 2022-12-25
      相关资源
      最近更新 更多