【问题标题】:Wicket SAML SSO redirect from mounted page?Wicket SAML SSO 从已安装页面重定向?
【发布时间】:2016-09-23 11:19:41
【问题描述】:

我想在我的 Wicket 应用程序中使用 Web SSO SAML。我认为挂载Page 并尝试在其中使用OpenSAML 是个好主意。

我尝试像这样在HttpServletReponse 上直接使用OpenSAML 的HTTPRedirectDeflateEncoder

    WebResponse webResponse = (WebResponse) this.getRequestCycle().getResponse();
    HttpServletResponse httpServletResponse = (HttpServletResponse) webResponse.getContainerResponse();

然后我使用解码器构建重定向并提交响应。

但是,当然,这会产生错误,因为我误用了 Wicket 方式做事。

2016-09-23 13:13:16,236 ERROR - ListenerCollection         - Error invoking listener: org.apache.wicket.Application$3@4c8f505b
java.lang.IllegalStateException: Response is committed

以我可以访问 Wicket 的会话等的方式进行重定向的正确方法是什么?因为如果我知道用户的某些属性(可能已经有WicketSession),我想阻止这种重定向?

【问题讨论】:

  • 你在哪里做重定向?看起来您尝试在响应已提交的请求周期结束时执行此操作。是否可以在 IRequestCycleListener 中执行此操作?
  • 我目前在 Page 的构造函数中执行此操作。我知道有一个RedirectException,但这并不能提供足够的控制。我将如何在IRequestCycleListener 中做到这一点?我从来没有在 Wicket 内部干预过这么远
  • 目前还不清楚您到底在做什么。仅仅打开容器响应不应该导致这样的错误。你在页面构造函数中用它做什么?
  • 好吧,我真的不需要在 Page 构造函数中这样做,但我还找不到更好的方法。我想根据WicketSession 中的值直接重定向到外部网址,并且我需要能够将标头添加到HttpServletResponse
  • 目前还不清楚为什么它在页面构造函数中失败并出现此错误。但我建议您改用 IRequestCycleListener#onBeginRequest()。

标签: redirect wicket saml


【解决方案1】:

我最终是这样解决的:

public SSOSamlPage(final PageParameters pp) {
    final WebResponse webResponse = (WebResponse) this.getRequestCycle().getResponse();
    final HttpServletResponse httpServletResponse = (HttpServletResponse) webResponse.getContainerResponse();

     final IModel<String> urlModel = Model.of("");
    final HTTPRedirectDeflateEncoder encoder = new HTTPRedirectDeflateEncoder() {
        @Override
        protected void doEncode() throws MessageEncodingException {
            final MessageContext<SAMLObject> messageContext = this.getMessageContext();

            LOG.info("setRelayState for PP: {}", pp);

            SAMLBindingSupport.setRelayState(messageContext, PageParameterUtils.toBase64(pp));

            final SAMLObject outboundMessage = messageContext.getMessage();

            final String endpointURL = this.getEndpointURL(messageContext).toString();

            this.removeSignature(outboundMessage);

            final String encodedMessage = this.deflateAndBase64Encode(outboundMessage);

            final String redirectURL = this.buildRedirectURL(messageContext, endpointURL, encodedMessage);
            urlModel.setObject(redirectURL);
        }

    };
 ....
 throw new RedirectToUrlException(urlModel.getObject());

【讨论】:

    猜你喜欢
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多