Создайте утверждение SAML и подпишите ответ

У меня есть веб-приложение Java. Я хочу реализовать вход SAML Single-Sign-On для своего приложения. У меня есть эта программа GitHub onelogin для отправки запроса и получения ответа. Но это не работало должным образом. Я создал там один аккаунт. Но у меня нет корпоративной учетной записи. Когда я запускаю приложение, оно переходит на страницу onelogin. Я попытался войти в систему, но он ничего не возвращает в ответ, показывая, что у меня нет разрешения. Если я также предоставлю неправильные учетные данные, он не даст никакого ответа SAML.

Поэтому я решил создать утверждение и подписать его.

  1. Нужно ли сначала отправить запрос SAML любому поставщику удостоверений?
  2. Как создать образец утверждения SAML вместо перехода к IdP (Как это нормально?)
  3. Когда я получу ответ SAML, как мне подписать его в своем приложении и продолжить?

Спасибо

ОБНОВЛЕНИЕ 1

<?xml version="1.0" encoding="UTF-8"?>
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
  ID="123" InResponseTo="abc" IssueInstant="2014-11-21T17:13:42.872Z" 
  Version="2.0">
    <samlp:Status>
        <samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/>
    </samlp:Status>
    <saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" Version="2.0">
        <saml:Subject>
            <saml:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">
                [email protected]
            </saml:NameID>
        </saml:Subject>
        <saml:AuthnStatement AuthnInstant="2014-11-21T17:13:42.899Z">
            <saml:AuthnContext>
                <saml:AuthnContextClassRef>
                    urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
                </saml:AuthnContextClassRef>
            </saml:AuthnContext>
        </saml:AuthnStatement>
    </saml:Assertion>
</samlp:Response>

person iUser    schedule 21.10.2014    source источник


Ответы (2)


Вы также можете использовать Java Saml от Onelogin, чтобы подписать ответ, используя их служебный класс (com.onelogin. saml2.util.Util):

// loads xml string into Document
Document document = Util.loadXML(saml);

// loads certificate and private key from string
X509Certificate cert = Util.loadCert(pubKeyBytes);
PrivateKey privateKey = Util.loadPrivateKey(privKeyBytes);

// signs the response
String signedResponse = Util.addSign(document, privateKey, cert, null);

Вы также можете использовать другой метод .addSign, который принимает Node в качестве первого параметра для подписи утверждения ответа SAML.

Их зависимость от Maven:

<dependency>
    <groupId>com.onelogin</groupId>
    <artifactId>java-saml</artifactId>
    <version>2.0.0</version>
</dependency>
person shimon001    schedule 01.09.2017
comment
Вау! Отличный ответ :) - person Sunil Dabburi; 24.10.2018

Первое, что вам нужно сделать, это прочитать о протоколе SAML. У меня есть два блога, которые я могу порекомендовать.

Затем вы можете выбрать интеграцию SAML в свое приложение или использовать стороннее приложение для интеграции. Типичными сторонними приложениями являются Shibboleth и OpenAM.

Если вы решите встроить его в свое приложение, вы можете, например, использовать OpenSAML. OpenSAML — это библиотека, помогающая работать с SAML-сообщениями. У меня есть несколько блогов на эту тему и одна книга, с которой хорошо начать

О ваших вопросах.

  1. Вам не нужно отправлять запрос. IDP может запустить процесс без запроса.
  2. Ну, вы можете создать его, просто отредактировав тот, который вы нашли. Вы также можете использовать OpenSAML для создания утверждения
  3. Вы не подписываете ответ в своем приложении, его подписывает IDP. Проверка подписи зависит от программного обеспечения. Вот как это сделать в OpenSAML
person Stefan Rasmusson    schedule 21.10.2014
comment
В ПОРЯДКЕ. Таким образом, я могу жестко закодировать строку XML, как в другом примере, как утверждение SAML. Что мне не нужно подписывать. Тогда как я могу подтвердить это? Я не сохранил сертификат в хранилище ключей. - person iUser; 21.10.2014
comment
Я не знаю, что такое строка XML. вы подтверждаете с помощью сертификата. Это можно получить из файла или из метаданных SAML. - person Stefan Rasmusson; 21.10.2014
comment
См. Обновление 1. Утверждение, которое я скопировал из другого вопроса SO. Как проверить? Нужно ли устанавливать сертификат перед проверкой? - person iUser; 21.10.2014
comment
Опубликованное вами утверждение не подписано, поэтому вам не нужно его подтверждать. Вам понадобится сертификат. То, как он используется, если вам нужно его установить, зависит от используемого вами программного обеспечения. - person Stefan Rasmusson; 21.10.2014
comment
Извините, не понял. Я не использую никакого программного обеспечения. - person iUser; 21.10.2014
comment
Вам нужен код или программное обеспечение для проверки. если вы начнете использовать OpenSAML, вы не сможете использовать ссылку, которую я предоставил в своем ответе - person Stefan Rasmusson; 21.10.2014
comment
В порядке. Но сначала мне нужно установить сертификат, верно? У меня есть загруженный образец сертификата с расширением .cer . Есть ли какая-либо ссылка или пример кода о том, как tp сохраняет это в хранилище ключей и обновляет открытый ключ, чтобы я мог проверить его на соответствие утверждению SAML, а затем получить такие атрибуты, как идентификатор пользователя и адрес электронной почты? - person iUser; 21.10.2014