【问题标题】:SAML and Java Standalone application without browser?没有浏览器的 SAML 和 Java 独立应用程序?
【发布时间】:2015-01-23 06:03:54
【问题描述】:

我正在使用 SP (Spring-SAML) 和 IDP (WSO2IS) 测试 SSO。他们在浏览器上运行良好。

现在我想把它带到一个 Java 独立应用程序中。提供用户凭据和 SP URL,然后用户可以登录应用程序并访问 SP。 为了实现这一点,基本上我需要使用 HTTPClient(用于处理 Cookie、POST、Redirect、Auto-POST)并遵循浏览器上发生的 SAML 消息流。

我想知道最有效的方法。有什么库或例子吗?

非常感谢您的帮助。

【问题讨论】:

  • 这看起来像是一种使用 SAML 的笨拙方式。为什么要这么做,申请的目的是什么?
  • 其实独立应用不需要单点登录功能。因为 IDP 有用户数据存储,应用程序希望通过 IDP 验证用户并让他们使用 SP,他们可以执行一些 REST 请求。有更好的方法吗?
  • 好的,如果 IDP 实现了一些其他协议来使用,最好的办法是,因为这并不是最佳的。但是我锁定了更好的解决方案,您可以尝试搜索一些无头浏览器以在您的代码中使用

标签: single-sign-on saml wso2is spring-saml


【解决方案1】:

我设法使用 HtmlUnit 无头浏览器创建了一个相对简单的解决方案。在我的情况下,我必须从需要 SAML 身份验证的网站下载 PDF 文件。

import com.gargoylesoftware.htmlunit.UnexpectedPage;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.*;
import java.io.InputStream;
import org.apache.commons.io.IOUtils;

...

private static byte[] samlAuthenticateAndDownloadFile(String url, String username, String password) throws Exception {
    byte[] fileBytes;
    try (final WebClient webClient = new WebClient()) {
      final HtmlPage loginPage = webClient.getPage(url);

      final HtmlForm loginForm = loginPage.getForms().get(0);

      final HtmlSubmitInput button = loginForm.getInputByName("login");
      final HtmlTextInput usernameField = loginForm.getInputByName("username");
      final HtmlPasswordInput passwordField = loginForm.getInputByName("password");

      usernameField.setValueAttribute(username);
      passwordField.setValueAttribute(password);

      final UnexpectedPage pdfPage = button.click();

      InputStream inputStream = pdfPage.getInputStream();

      fileBytes = IOUtils.toByteArray(inputStream);
    }

    return fileBytes;
  }

【讨论】:

  • 这是一种反模式,将身份验证锁定为仅用户名/密码,破坏了 SAML 的主要目的之一;它也很脆弱,因为它可以与您当前的 SAML 提供程序软件一起使用,但可能会在升级或更改时中断,这超出了实施/使用标准的点
猜你喜欢
  • 2012-11-30
  • 1970-01-01
  • 2015-04-10
  • 2013-03-13
  • 2010-10-25
  • 2013-07-30
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
相关资源
最近更新 更多