2014-11-25 65 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