【问题标题】:OpenSAML and RelayStateOpenSAML 和 RelayState
【发布时间】:2018-07-17 20:49:45
【问题描述】:

我浏览了这里的论坛并阅读了一些主题,但我认为我的问题没有答案。话虽如此,我绝不是 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 等的逻辑。我已经搜索了一段时间,但我没有找到一个我确定会是我正在寻找的示例 - 所以我希望那里的专家能够提供帮助?

【问题讨论】:

  • 也许这可能会有所帮助。我刚刚回答了一个类似的问题,但对于 javascript。我有一个带有 SAMLRequest 和 RelayState 的 JSP,它会自动发布,但它应该让您了解如何发送 RelayState stackoverflow.com/questions/48700273/…
  • 只是为了弄清楚你在问什么????您的站点(SP)导致客户端的浏览器向 ADFS 发出请求(GET 请求)?现在您想知道如何将 RelayState 附加到此请求?

标签: saml opensaml


【解决方案1】:

根据this,RelayState 通常用于 IDPInitiated。

根据this,“不要被 RelayState 服务于两个完全不同的目的这一事实混淆。对于 IdPInitiated,RelayState 指定 SP 的登录页面。对于 SPInitiated,它是 SP 维护状态的一种方式发送 AuthnRequest 和接收 SAML 响应之间的信息。RelayState 可以与 AuthnRequest 一起发送,IDP 必须将此 RelayState 与 SAML 响应一起返回。"

【讨论】:

  • 当然,但是,正如您在段落中所述,SP 也经常使用它来保存某些状态——比如在身份验证过程开始之前请求的 URL。如果有人深度链接到站点 somesite.com/this/is/a/protected/url ... 然后被重定向到 IdP,然后 IdP 将用户返回到 somesite.com/saml/auth 以处理响应,那么我可以在成功场景中使用中继状态来重定向用户访问原始 URL。我的问题不是中继状态是什么,而是如何将其传递给 IdP。
  • 如上 - 放入 AuthnRequest。
【解决方案2】:

你肯定想对了。您需要保存用户最初输入的 URL 并将其用作中继状态。

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

SAMLBindingSupport.setRelayState(messageContext, relayState);

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多