问题描述
我无法检索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('/');
}
);