OpenSAML和RelayState

时间:2018-02-07 14:09:07

标签: saml opensaml

我在这里浏览了论坛,并阅读了几个主题,但我不认为我的问题有答案。话虽如此,我绝不是SAML专家所以我读过的一些主题是用光滑的眼睛:)。

我继承了一些使用OpenSAML(在SP端)生成请求并将其发送到ADFS实现的代码。我正在研究的问题是,用户总是返回到相同的URL,无论初始请求是否指向网站的深层链接。现在,在ADFS方面,我知道重定向回SP是静态的,这对我们没有帮助,但我99.9%确定我们没有将任何重定向值传递给提供者。根据我的研究,我认为我应该使用RelayState来传递值,以便它回显给我,以便我可以在处理SAML响应后使用它。

我的问题是我不清楚如何首先传递RelayState。在我正在使用的代码中,我可以看到一个定义的类 -

public class HTTPRedirectTransportSender extends HTTPServletTransportSender
{
    private static final transient Logger LOG = LoggerFactory.getLogger(HTTPRedirectTransportSender.class);

    public HTTPRedirectTransportSender(HttpServletResponse httpServletResponse)
    {
        super(httpServletResponse);
    }


    @Override
    protected BaseHttpServletResponseXMLMessageEncoder buildMessageEncoder()
    {
        return new HTTPRedirectDeflateEncoder();
    }

}  

..如果我查看HttpRedirectDeflateDecoder,那么我可以看到关于构建url等的一些逻辑。我现在已经找了一段时间,但我还没有找到一个例子,我肯定会是我想要的 - 所以我希望那里的专家可以提供帮助吗?

2 个答案:

答案 0 :(得分:1)

您肯定正在考虑正确。您需要保存用户最初输入的URL,并将其用作中继状态。

对于OpenSAML v3,将中继状态附加到MessageContext。您必须找到应用程序在哪里构建MessageContext并执行以下操作:

SAMLBindingSupport.setRelayState(messageContext, relayState);

这是OpenSAML库提供的便捷方法。在后台,它正在从SAMLBindingContext访问MessageContext子上下文(如有必要,请创建它)并在其上设置中继状态。

messageContext.getSubcontext(SAMLBindingContext.class, true).setRelayState(relayState);

答案 1 :(得分:0)

RelayState通常用于this的IDPInitiated。

根据this,“不要因为RelayState有两个完全不同的目的而混淆。对于IdPInitiated,RelayState指定SP的登陆页面。对于SPInitiated,它是SP的一种方式在发送AuthnRequest和接收SAML响应之间维护状态信息.RelayState可以与AuthnRequest一起发送,IDP必须返回此RelayState以及SAML响应。“