2014-11-25 2 views
2

Я тестирую SSO с SP (Spring-SAML) и IDP (WSO2IS). Они отлично работают в браузере.Самостоятельное приложение SAML и Java без браузера?

Теперь я хочу привести его в автономное приложение Java. Предоставляя учетные данные пользователя и URL-адрес SP, пользователь может войти в приложение и получить доступ к SP. Чтобы реализовать это, в основном мне нужно использовать HTTPClient (для обработки Cookie, POST, Redirect, Auto-POST) и следить за потоком сообщений SAML, как это происходит в браузере.

Я хотел бы знать наиболее эффективный способ сделать это. Есть ли библиотека или пример?

Ваша помощь очень ценится.

+0

Это швы, как комковатый способ использования SAML. Почему вы хотите это сделать, какова цель приложения? –

+0

На самом деле автономное приложение не требует функции единого входа. Поскольку IDP имеет хранилище пользовательских данных, приложение хочет проверить пользователей через IDP и позволить им использовать SP, для которого они могут выполнять некоторые запросы REST. Есть ли лучший подход? – Rocherlee

+1

Хорошо, лучше было бы, если бы IDP воспользовался некоторыми другими протоколлами, потому что это не совсем оптимально. Но я блокирую лучшие решения, которые вы могли бы попытаться найти в каком-то браузере без браузера, который вы используете в своем коде –

ответ

-1

Мне удалось создать относительно простое решение, используя браузер без гарнитуры HtmlUnit. В моем случае мне пришлось загрузить PDF-файл с веб-сайта, который требовал аутентификации SAML.

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-провайдера, но может ломаться при обновлениях или изменениях, которые помимо того, что они реализуют/используют стандарт –

Смежные вопросы