我正在用SP(Spring-SAML)和IDP(WSO2IS)测试SSO。他们在浏览器上工作正常。没有浏览器的SAML和Java独立应用程序?
现在我想把它带到一个Java独立应用程序。提供用户证书和SP URL,然后用户可以登录应用程序并访问SP。 要实现这一点,基本上我需要使用HTTPClient(用于处理Cookie,POST,重定向,自动POST),并遵循SAML消息流,因为它发生在浏览器上。
我想知道最有效的方法来做到这一点。有没有图书馆或例子?
非常感谢您的帮助。
我正在用SP(Spring-SAML)和IDP(WSO2IS)测试SSO。他们在浏览器上工作正常。没有浏览器的SAML和Java独立应用程序?
现在我想把它带到一个Java独立应用程序。提供用户证书和SP URL,然后用户可以登录应用程序并访问SP。 要实现这一点,基本上我需要使用HTTPClient(用于处理Cookie,POST,重定向,自动POST),并遵循SAML消息流,因为它发生在浏览器上。
我想知道最有效的方法来做到这一点。有没有图书馆或例子?
非常感谢您的帮助。
我设法使用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提供商软件,但可能会因为实施/使用标准而导致升级或更改中断 – 2016-08-26 06:00:10
这种接缝像一种使用SAML的混合方法。你为什么想这样做,应用程序的目的是什么? – 2014-11-25 11:24:19
实际上,独立应用程序不需要SSO功能。由于IDP具有用户数据存储,因此该应用程序希望通过IDP验证用户,并让他们使用可向其执行一些REST请求的SP。有更好的方法吗? – Rocherlee 2014-11-25 15:14:45
好吧,如果IDP实施了其他协议,最好的方法是使用其他协议,因为这不是最佳选择。但我锁定更好的解决方案,您可以尝试搜索某些无头浏览器以在您的代码中使用代码 – 2014-11-25 21:56:13