Express 如何使用passport saml修复SLO,该saml在第一次注销时有效,但在后续注销时无效

Express 如何使用passport saml修复SLO,该saml在第一次注销时有效,但在后续注销时无效,express,adfs,passport-saml,Express,Adfs,Passport Saml,我必须将应用程序连接到公司的ADFS服务器。我正在为SSO和SLO使用passport saml。SSO工作,SLO仅在第一次注销时工作。我试图让SLO在用户每次注销时都能正常工作 我一直在到处寻找这个问题的解决办法,但它回避了我。详情如下: 我清除浏览器中的Cookie,从头开始 我登录到我的应用程序,该应用程序重定向到ADFS的登录页面 输入用户凭据,然后ADFS重定向回我的应用程序主页 我注销了我的应用程序,一个请求被发送到ADFS服务器,在本地和ADFS上终止我的会话,然后我被重定向回我

我必须将应用程序连接到公司的ADFS服务器。我正在为SSO和SLO使用passport saml。SSO工作,SLO仅在第一次注销时工作。我试图让SLO在用户每次注销时都能正常工作

我一直在到处寻找这个问题的解决办法,但它回避了我。详情如下:

  • 我清除浏览器中的Cookie,从头开始
  • 我登录到我的应用程序,该应用程序重定向到ADFS的登录页面
  • 输入用户凭据,然后ADFS重定向回我的应用程序主页
  • 我注销了我的应用程序,一个请求被发送到ADFS服务器,在本地和ADFS上终止我的会话,然后我被重定向回我的应用程序主页
  • 我再次登录,这一切正常
  • 我注销,但这次我被发送到我的ADFS服务器的注销页面 进一步检查表明,ADFS未清除其Cookie,因此ADFS会话保持活动状态

    我使用Firefox的SAML查看器插件来观察正在发生的事情,以下是我的发现:

    成功注销时:

    HTTP:

    获取HTTP/1.1 主持人:myadfs.org 用户代理:Mozilla/5.0(Macintosh;英特尔Mac OS X 10.14;rv:66.0)Gecko/20100101 Firefox/66.0 接受:text/html、application/xhtml+xml、application/xml;q=0.9,/;q=0.8 接受语言:en-US,en;q=0.5 接受编码:gzip,deflate,br 推荐人: 连接:保持活力 曲奇:2)一个词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词词VVEOA2CRQBBNYK+HoonL6+oBIJd6+XZ2 BBBQ(2)BBQ(2)BBQ(2)BBQ(2)BQ(2)BQ(2)BQ(2)BQ(2)BQ(2)BQ(2)BQ(2)BQ(2)BQ(2)BBQ(2)BQ(2)BBQ(2)BBQ(2)BQ(2)BBQ(2)BQ(2)BQ(2)BQ(2)BQ(2)BQ(2)BQ(2)BQ(2)BZZZZZZZZGGGGGGGGGGGGGGGGZZZZZZZZZZZZZZ4(4(2)2)2)ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ4(2)2)2(2(2)对(2)2)对A9GNIJ4KSOC/5Rtw4JQVJpSeQuM2.2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 xnyuwVPpwPVEiNbHQn2.一个新的知识点,一个新的知识点,一个新的知识点,一个新的知识点,一个新的知识点,一个新的知识点,一个新的知识点,一个新的知识点,一个新的知识点,一个新的知识点,一个新的知识点,一个新的知识点,一个新的知识点,一个新的知识点,一个新的知识点,一个新的知识点,一个新的知识点,一个知识点,一个新的知识点,一个新的知识点,一个知识点,一点,一个新的知识点,一个新的知识点,一点,一点,一个新的知识点,一点,一点,一点,一点,一点,一点,一点,一点,一点,一点,一点,一点,一点,一点,一点,一点,一点,一点,一点,一点,一点,一点,D5EZR3WQFDXPPRJYQ+qfx8kyUCe/2.在一个研究中,我们发现了一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于一个关于关于一个关于一个关于一个关于一个关于一个关于一个关于关于IQX5Si4M16ZYIMMXA4NQ6XVCR2HFLQBSLQJHIQKIFOCKT9LNRDKNZLGHQKSPUH44QLBQ4STHK0ID13FFMBS5REEE1CWA89OCELHEA/Z9HPETJPPC3Q52CAXBGBOJECTR6OYFYFQKBATQHDTU09/nJOafMK5ID1pf7pmBL+ZTH7Kl64lxhyO/9F84TCTQHFQXGSIXMV+ZVAJANNL4E0GQJ0ULSY2H;SamlSession=ahr0chmlm2elmylmmzmcgnckmrldi5tb2zmaxr0lm9yzgywxzzzddwtyyxntrcymjiymxzfkzjy4m2hltm4ntktndvjns04odnklta3nmriydimj3yg=;msasauthenticated=NC8xNi8yMDE5IDExOjI2OjI4IEFN;MsisLopDetectionCookie=MjaxOS0Wnc0xNjoxMtoyNjoyOfcmq== 升级不安全的请求:1

    找到HTTP/1.1 302 内容长度:0 内容类型:text/html;字符集=utf-8 地点: 服务器:Microsoft HTTPAPI/2.0 P3P:ADFS没有P3P策略,请联系您网站的管理员以了解更多详细信息 设置Cookie:SamlSession=;expires=2019年4月15日星期一11:26:39 GMT;路径=/adfs 这是一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的一个新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的知识,新的知识,新的知识,新的知识,新的知识,新的中国中国中国中国中国中国中国中国的中国的中国的中国的一一一个新的知识,新的知识,新的知识,新的知识,新的知识,新的知识,新的新西兰;path=/adfs;HttpOnly;保护 MSISAuthenticated=;expires=2019年4月15日星期一11:26:39 GMT;路径=/adfs MSISAuth=;expires=2019年4月15日星期一11:26:39 GMT;路径=/adfs 返回URL=AHR0CHM6LY9YCHBZC29KZXYUBW9MZML0DC5VCMC6NDQZL2FKZNMVB3DHPXDZAWDUB3V0MS4W;path=/adfs;HttpOnly;保护 MSISSignoutProtocol=U2FtbA==;expires=2019年4月16日星期二11:36:39 GMT;path=/adfs;HttpOnly;保护 日期:2019年4月16日星期二11:26:39 GMT

    SAML:

    http://myadfs.org/adfs/services/trust 用户名_1df683da-3859-45c5-883d-076dba7b297b
    
    在随后未成功注销时:

    HTTP:

    获取HTTP/1.1 主持人:myadfs.org 用户代理:Mozilla/5.0(Macintosh;英特尔Mac OS X 10.14;rv:66.0)Gecko/20100101 Firefox/66.0 接受:text/html、application/xhtml+xml、application/xml;q=0.9,/;q=0.8 接受语言:en-US,en;q=0.5 接受编码:gzip,deflate,br 推荐人: 连接:保持活力 Cookie:msisLopDetectionCookie=mjaxOS0WNC0xNjoxMTOYODYNOYNLPCMQ==;这是一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的概念,一个新的一个新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的概念,新的知识,新的知识,新的知识,新的知识,新的知识,新的中国中国中国中国中国中国中国中国的中国的中国的中国的一一一个新的知识,新的知识,新的知识,新的知识,新的知识,新的知识,新的新西兰;返回URL=AHR0CHM6LY9YCHBZC29KZXYUBW9MZML0DC5VCMC6NDQZL2FKZNMVB3DHPXDZAWDUB3V0MS4W;MSISSignoutProtocol=U2FtbA==;MSISAuth=AAEAAFOnxdlEvO8Le/Gti39Bx6BFj1cEJ39/A6ogocbLbXlBnq07uT1v+muazzs0nqyb1wmqx3o8otwpancfpcefqbngzsvswi/oAXmuDih8uBG9MVPfstAu/cfpxl95v2iujx6r3tv08fqipxw/1cha7qm8qm8vxu5a516zfsztaxke+ITD3B
    const fs = require('fs');
    const passport = require('passport');
    const SamlStrategy = require('passport-saml').Strategy;
    require('dotenv').config();
    
    passport.serializeUser((user, done) => {
        done(null, user);
    });
    
    passport.deserializeUser((user, done) => {
        done(null, user);
    });
    
    passport.use(new SamlStrategy({
        entryPoint: 'https://myadfs.org/adfs/ls',
        issuer: 'https://example.com',
        callbackUrl: process.env.NODESERVERURL + ':' + process.env.PORT + '/authenticate/adfs/postResponse',
        privateCert: fs.readFileSync(__dirname + '/private/keys/fpcdr.key', 'utf-8'),
        logoutUrl: 'https://myadfs.org/adfs/ls/?wa=wsignout1.0',
        signatureAlgorithm: 'sha256'
    },
        function(profile, done) {
            const username = profile.nameID.toLowerCase();
            const email = profile['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress'].toLowerCase();
            const sessionIndex = profile.sessionIndex;
            return done(null, {
                username,
                email,
                sessionIndex
            });
        })
    );
    
    module.exports = passport;
    
    module.exports.adfsAuthenticate = function(req, res) {
    
        const email = req.user.email;
        const username = req.user.username;
    
        if (process.env.UAT === 'true') {
            res.status(302).redirect(LANDING_PAGE_REDIRECT_DEV);
        } else {
            res.status(302).redirect(LANDING_PAGE_REDIRECT_PROD);
        }
    };
    
    module.exports.logout = function(req, res) {
        req.logout();
        req.session.destroy(function (err) {
            if (!err) {
                res.status(200).clearCookie('connect.sid', {path: '/'}).json({status: "Success"});
            } else { alert(err); }
        });
    };