1

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

我一直在寻找解决这个问题的方法,但它避开了我。这是详细信息:

  1. 我清除浏览器中的 cookie 以从头开始。
  2. 我登录到我的应用程序,该应用程序重定向到 ADFS 的登录页面
  3. 输入用户凭据,然后 ADFS 重定向回我的应用主页
  4. 我注销了我的应用程序,并向 ADFS 服务器发送了一个请求,在本地和 ADFS 上终止了我的会话,然后我被重定向回我的应用程序主页
  5. 我再次登录,这按预期工作
  6. 我注销,但这次我被发送到我的 ADFS 服务器的注销页面。

进一步检查表明 ADFS 没有清除其 cookie,因此 ADFS 会话保持活动状态。

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

成功注销时:

HTTP:

GET https://myadfs.org/adfs/ls/?wa=wsignout1.0 HTTP/1.1 主机:myadfs.org 用户代理:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:66.0) Gecko/20100101 Firefox/66.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9, / ;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br参考:https ://example.com/dashboard/data DiQx5si4M16zYIMmxa4nq6XVcr2hFlqbsLQjhIqkiFOCkt9LNRdKNZlghQkspUH44qLBq4sTHK0iD13FFmBs5rEE1CWa89oCELhea/Z9hPEtjPpC3Q52cAXBgbOJCTr6OYFYfQKbATqHdTU09/nJOafMK5ID1pf7pmBL+ZTH7Kl64lxhyO/9F84t47TctQhhFqxgsIxmv+ZVHajanNl4E0gXqJ0ULsY2h; SamlSession=aHR0cHMlM2ElMmYlMmZmcGNkcmRldi5tb2ZmaXR0Lm9yZyZGYWxzZSZDdWtyYXNTRCYmJiYmXzFkZjY4M2RhLTM4NTktNDVjNS04ODNkLTA3NmRiYTdiMjk3Yg==;MSISAuthenticated=NC8xNi8yMDE5IDExOjI2OjI4IEFN; MSISLoopDetectionCookie=MjAxOS0wNC0xNjoxMToyNjoyOFpcMQ== 升级不安全请求:1 SamlSession=aHR0cHMlM2ElMmYlMmZmcGNkcmRldi5tb2ZmaXR0Lm9yZyZGYWxzZSZDdWtyYXNTRCYmJiYmXzFkZjY4M2RhLTM4NTktNDVjNS04ODNkLTA3NmRiYTdiMjk3Yg==;MSISAuthenticated=NC8xNi8yMDE5IDExOjI2OjI4IEFN; MSISLoopDetectionCookie=MjAxOS0wNC0xNjoxMToyNjoyOFpcMQ== 升级不安全请求:1 SamlSession=aHR0cHMlM2ElMmYlMmZmcGNkcmRldi5tb2ZmaXR0Lm9yZyZGYWxzZSZDdWtyYXNTRCYmJiYmXzFkZjY4M2RhLTM4NTktNDVjNS04ODNkLTA3NmRiYTdiMjk3Yg==;MSISAuthenticated=NC8xNi8yMDE5IDExOjI2OjI4IEFN; MSISLoopDetectionCookie=MjAxOS0wNC0xNjoxMToyNjoyOFpcMQ== 升级不安全请求:1

HTTP/1.1 302 找到 Content-Length: 0 Content-Type: text/html; charset=utf-8 位置:https://example.com:443/login?SAMLRequest=lZLfa4MwEMf%2fFcl71KjxR7BCqS9C18I69rCXEjXpZJq4XCz982crY6yMwh7vuO9973N3OfChH9lWn%2fRkn8XnJMA6VblCR%2bpzQqWUOKWE4igMUlz7nGKexHUYJdSnKUXOqzDQabVCgesjpwKYRKXAcmXnlE8y7EeYxC%2bEsCBmYeamCX1DTjm7dIrbm%2fLd2hGY58mxaU0rzu6gpeysdbU5eb0%2bdQo5G61AXHtORjHNoQOm%2bCCA2YYd1k9bNtuzZilik4JRNJ3sRIucnbZ7tTdraYW5HykkPyNdhl4Bu23jsctotNWN7lGR33DNIn0s4gDCXHFRccWdac04Auh7XN5K8ObSc9cI8KyZwObeYlPku7ltVf7TbjN9GA6HMvcWeZEvFz8IuB6uUq24FEfSyjgNW47DlGY4og3F6RxjP4nbmid1kCV17v2h%2fE7%2beqDiCw%3d%3d&Signature=pT%2fSUpslARJlvOCah5VzZk4stZLIREyHmUFOO4siHUbkL5eJG4QsfYj9Pq%2bwxnOaPaevYkmiXq0rft3drTzJHspns9UbucyYQvEaSAZVmRTTyfPC3Z0EgVGSvtr0JL3nuDPsq2IfbToseuQQtJFsA%2b94D8KtaLjtUJxiMcQMHyg2yR00Ac3NGt9AsRg1X73X%2frt0XZDN9bSt4R8t%2bt2Yl2UsZsL4GHTGk7RbN3AUrYHsLtKeuN07umXqX3otVtHo%2f9tx2w2h1glYycYbFCk%2bWjox8Mej%2fiLLkpAhw9EXlhiTGrEJ2%2bcYvnQxGokOsz2vXEOoc3%2fhle27LuTPFMN9yw%3d%3d&SigAlg=http%3a%2f%2fwww.w3.org%2f2001%2f04%2fxmldsig-more%23rsa- sha256 服务器:Microsoft-HTTPAPI/2.0 P3P:ADFS 没有 P3P 策略,请联系您的站点管理员了解更多详细信息 Set-Cookie: SamlSession=; 过期=格林威治标准时间 2019 年 4 月 15 日星期一 11:26:39;path=/adfs SamlLogout=aHR0cCUzYSUyZiUyZnJwcHNzb2Rldi5tb2ZmaXR0Lm9yZyUyZmFkZnMlMmZzZXJ2aWNlcyUyZnRydXN0Pz8/aHR0cHMlM2ElMmYlMmZmcGNkcmRldi5tb2ZmaXR0Lm9yZyZGYWxzZSZDdWtyYXNTRCYmJiYmXzFkZjY4M2RhLTM4NTktNDVjNS04ODNkLTA3NmRiYTdiMjk3Yj9fNTBhMTVmZmYtODUxNS00MzI4LWIwYTUtYTc2YjM0NzUwNTg1P3VybiUzYW9hc2lzJTNhbmFtZXMlM2F0YyUzYVNBTUwlM2EyLjAlM2FzdGF0dXMlM2FTdWNjZXNz; 路径=/adfs; 仅http;安全 MSISAuthenticated=; 过期=格林威治标准时间 2019 年 4 月 15 日星期一 11:26:39;路径=/adfs MSISAuth=; 过期=格林威治标准时间 2019 年 4 月 15 日星期一 11:26:39;路径=/adfs ReturnUrl=aHR0cHM6Ly9ycHBzc29kZXYubW9mZml0dC5vcmc6NDQzL2FkZnMvbHMvP3dhPXdzaWdub3V0MS4w; 路径=/adfs; 仅http;安全 MSISSignoutProtocol=U2FtbA==; 到期=格林威治标准时间 2019 年 4 月 16 日星期二 11:36:39;路径=/adfs; 仅http;安全日期:2019 年 4 月 16 日星期二 11:26:39 GMT

萨姆勒:

<samlp:LogoutRequest ID="_50a15fff-8515-4328-b0a5-a76b34750585"
                     Version="2.0"
                     IssueInstant="2019-04-16T11:26:39.875Z"
                     Destination="https://example.com/login"
                     Consent="urn:oasis:names:tc:SAML:2.0:consent:unspecified"
                     NotOnOrAfter="2019-04-16T11:31:39.875Z"
                     xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
                     > <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">http://myadfs.org/adfs/services/trust</Issuer> <NameID xmlns="urn:oasis:names:tc:SAML:2.0:assertion">USERNAME</NameID> <samlp:SessionIndex>_1df683da-3859-45c5-883d-076dba7b297b</samlp:SessionIndex> </samlp:LogoutRequest>

在随后的不成功注销中:

HTTP:

GET https://myadfs.org/adfs/ls/?wa=wsignout1.0 HTTP/1.1 主机:myadfs.org 用户代理:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:66.0) Gecko/20100101 Firefox/66.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9, / ;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br参考:https ://example.com/dashboard/data 连接:保持活动 Cookie:MSISLoopDetectionCookie=MjAxOS0wNC0xNjoxMToyODoyNlpcMQ==; SamlLogout=aHR0cCUzYSUyZiUyZnJwcHNzb2Rldi5tb2ZmaXR0Lm9yZyUyZmFkZnMlMmZzZXJ2aWNlcyUyZnRydXN0Pz8/aHR0cHMlM2ElMmYlMmZmcGNkcmRldi5tb2ZmaXR0Lm9yZyZGYWxzZSZDdWtyYXNTRCYmJiYmXzFkZjY4M2RhLTM4NTktNDVjNS04ODNkLTA3NmRiYTdiMjk3Yj9fNTBhMTVmZmYtODUxNS00MzI4LWIwYTUtYTc2YjM0NzUwNTg1P3VybiUzYW9hc2lzJTNhbmFtZXMlM2F0YyUzYVNBTUwlM2EyLjAlM2FzdGF0dXMlM2FTdWNjZXNz; ReturnUrl=aHR0cHM6Ly9ycHBzc29kZXYubW9mZml0dC5vcmc6NDQzL2FkZnMvbHMvP3dhPXdzaWdub3V0MS4w; MSISSignoutProtocol=U2FtbA==; oA4K2o87swOYB81FTkQNBnNZG171szH89jijOuEAI7hAWdAnM2LjagGZwWpuF2yHbJqQqsGzjvnqbQ6yMTvaEbkooSelFEBeRW2Gg5rGAjj5Pvs+T0ljhVlby6FfFKJ71NDBvn/7PGIglARSZqUZcAuthlhr8pta11WnhsfnyumvLfWvOZHZZjWslKMLBpGEBe1WgcYBUBYUrUeHmCqDRy5Zc4KJXwGrY; SamlSession=aHR0cHMlM2ElMmYlMmZmcGNkcmRldi5tb2ZmaXR0Lm9yZyZGYWxzZSZDdWtyYXNTRCYmJiYmX2NlNDAwODQxLTA2ZDItNDI3Ni05MTRlLWU5N2ExYWRlZmQzZQ==;MSISAuthenticated=NC8xNi8yMDE5IDExOjI4OjI2IEFN 升级-不安全-请求:1

HTTP/1.1 200 OK Cache-Control: no-cache,no-store Pragma: no-cache Content-Length: 8957 Content-Type: text/html; charset=utf-8 过期:-1 服务器:Microsoft-HTTPAPI/2.0 日期:2019 年 4 月 16 日星期二 11:28:45 GMT

萨姆勒:

未发送 SAML

您将看到,在成功注销时,ADFS 会设置 cookie 以清除它们,而不成功的注销则不会。此外,不成功的注销不会发送 SAML 注销请求。

最后,当我清除浏览器中的 cookie 时,第一次登录/注销会话将再次按预期工作,而所有后续注销都不会。我可以看到 cookie 在后续注销时保留,因为 ADFS 没有收到 SAML 注销请求。我只是不明白这在第一次注销时是如何工作的,但在接下来的注销中却不是。我查看了护照-saml 的代码,但似乎找不到问题所在。

任何帮助都会很棒。

这是我的 passport.js 设置:

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);
    }
};

adfs 注销:

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); }
    });
};
4

1 回答 1

1

我观察到有一个 cookie 存储在名为“MSISSignoutProtocol”的浏览器中,如果此 cookie 存在,则注销在后续请求中不会按预期工作。

要使其正常工作,您可能需要实施大多数 IDP 支持的正确 SAML 注销。

于 2020-04-06T12:29:11.633 回答