使用Passport-SAML检索RelayState值

问题描述

我无法检索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',{ 'failureRedirect': '/','failureFlash': true }),res) 
    {
        res.redirect('/');
    }
);

解决方法

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

所以在你的情况下,这应该有效:

app.get(
    '/login',function(req,res,next){
        // you could redirect to /login?RelayState=whatever,or set query here,// the value must be encoded for passing in the query string:
        req.query.RelayState = encodeURIComponent('my relay state');
    },passport.authenticate('saml',{ 'successRedirect': '/','failureRedirect': '/login' }),res) 
    {
        res.redirect('/');
    }
);
app.post(
    '/adfs/postResponse',{ 'failureRedirect': '/','failureFlash': true }),res) 
    {
        console.log(`relay state was ${decodeURIComponent(req.body.RelayState)}`);
        res.redirect('/');
    }
);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...