2014-11-25 67 views
2

我正在用SP(Spring-SAML)和IDP(WSO2IS)测试SSO。他们在浏览器上工作正常。没有浏览器的SAML和Java独立应用程序?

现在我想把它带到一个Java独立应用程序。提供用户证书和SP URL,然后用户可以登录应用程序并访问SP。 要实现这一点,基本上我需要使用HTTPClient(用于处理Cookie,POST,重定向,自动POST),并遵循SAML消息流,因为它发生在浏览器上。

我想知道最有效的方法来做到这一点。有没有图书馆或例子?

非常感谢您的帮助。

+0

这种接缝像一种使用SAML的混合方法。你为什么想这样做,应用程序的目的是什么? – 2014-11-25 11:24:19

+0

实际上,独立应用程序不需要SSO功能。由于IDP具有用户数据存储,因此该应用程序希望通过IDP验证用户,并让他们使用可向其执行一些REST请求的SP。有更好的方法吗? – Rocherlee 2014-11-25 15:14:45

+1

好吧,如果IDP实施了其他协议,最好的方法是使用其他协议,因为这不是最佳选择。但我锁定更好的解决方案,您可以尝试搜索某些无头浏览器以在您的代码中使用代码 – 2014-11-25 21:56:13

回答

-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; 
    } 
+0

,这是一种反向模式,仅将身份验证锁定为用户名/密码,并且失败了SAML的主要用途之一;它也非常脆弱,因为它可能适用于您当前的SAML提供商软件,但可能会因为实施/使用标准而导致升级或更改中断 – 2016-08-26 06:00:10