Passport saml 使用Passport SAML检索RelayState值

Passport saml 使用Passport SAML检索RelayState值,passport-saml,Passport Saml,我无法检索RelayState值。有人能告诉我或提供相关文档的链接吗 这是我到目前为止的设置和路线 设置 const saml_strategy = new saml.Strategy( { 'callbackUrl': 'https://callback-url/adfs/postResponse', 'entryPoint': 'https://entry-url/adfs/ls/', 'issuer': 'issuer-name',

我无法检索RelayState值。有人能告诉我或提供相关文档的链接吗

这是我到目前为止的设置和路线

设置

const saml_strategy = new saml.Strategy(
    {
        'callbackUrl': 'https://callback-url/adfs/postResponse',
        'entryPoint': 'https://entry-url/adfs/ls/',
        'issuer': 'issuer-name',
        'decryptionPvk': fs.readFileSync('./private.key', 'utf-8'),
        'cert': [idp_cert],
        'identifierFormat': null,
   'disableRequestedAuthnContext': true,
   'authnContext': ["urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport"],
   'additionalParams':{'RelayState':'test'}
    }, 
路线

app.get(
    '/', 
    function (req, res) {
        if (req.isAuthenticated()) 
        {
           res.send( '{ "authenticated": true }' );
        } 
        else 
        {
            res.send( '{ "authenticated":  false }' );
        }
    }
);

app.get(
    '/login', 
    passport.authenticate('saml', { 'successRedirect': '/', 'failureRedirect': '/login' }),
    function(req, res) 
      {
        res.redirect('/');
      }
);

///login/callback
app.post(
    '/adfs/postResponse',
    passport.authenticate('saml', { 'failureRedirect': '/', 'failureFlash': true }),
    function(req, res) 
    {
        res.redirect('/');
    }
);

RelayState
是从初始登录请求页面的查询字符串设置的,然后(如果IdP尊重它),它在回调POST响应的主体中可用

因此,在您的情况下,这应该是可行的:

app.get(
“/login”,
功能(req、res、next){
//您可以重定向到/login?RelayState=无论什么,或在此处设置查询,
//必须对值进行编码才能传入查询字符串:
req.query.RelayState=encodeURIComponent(“我的中继状态”);
},
authenticate('saml',{'successRedirect':'/','failureRedirect':'/login'}),
功能(req、res)
{
res.redirect('/');
}
);
app.post(
“/adfs/postResponse”,
passport.authenticate('saml',{'failureRedirect':'/','failureFlash':true}),
功能(req、res)
{
log(`relay state为${decodeURIComponent(req.body.RelayState)}`);
res.redirect('/');
}
);

RelayState
是从初始登录请求页面的查询字符串设置的,然后(如果IdP尊重它),它可以在回调POST响应的主体中使用

因此,在您的情况下,这应该是可行的:

app.get(
“/login”,
功能(req、res、next){
//您可以重定向到/login?RelayState=无论什么,或在此处设置查询,
//必须对值进行编码才能传入查询字符串:
req.query.RelayState=encodeURIComponent(“我的中继状态”);
},
authenticate('saml',{'successRedirect':'/','failureRedirect':'/login'}),
功能(req、res)
{
res.redirect('/');
}
);
app.post(
“/adfs/postResponse”,
passport.authenticate('saml',{'failureRedirect':'/','failureFlash':true}),
功能(req、res)
{
log(`relay state为${decodeURIComponent(req.body.RelayState)}`);
res.redirect('/');
}
);

谢谢你,詹姆斯,我会尝试一下,让你知道结果。谢谢你,詹姆斯,我会尝试一下,让你知道结果。