没有浏览器的 SAML 和 Java 独立应用程序?

Posted

技术标签:

【中文标题】没有浏览器的 SAML 和 Java 独立应用程序?【英文标题】:SAML and Java Standalone application without browser? 【发布时间】: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 实现了一些其他协议来使用,最好的办法是,因为这并不是最佳的。但是我锁定了更好的解决方案,您可以尝试搜索一些无头浏览器以在您的代码中使用 【参考方案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 提供程序软件一起使用,但可能会在升级或更改时中断,这超出了实施/使用标准的点

以上是关于没有浏览器的 SAML 和 Java 独立应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

在没有浏览器的情况下对WSO2 Identity Server进行身份验证,并获取SAML2断言消息

具有 SSO (SAML) 和 ADFS 的 Java 应用程序

SAML简介

SAML 工件的用途是啥?

SAML 中的服务提供者和实际应用程序之间如何/应该如何进行通信?

如何使用 SAML 和 Shibboleth 实施或集成单点登录