Невозможно создать ответ SAML из IDP - PullRequest
3 голосов
/ 27 февраля 2020

Мне нужно создать единую регистрацию (SSO) для Salesforce. Для авторизации я буду использовать номер мобильного телефона пользователя с OTP. Мне нужно только создать ответ SAML, используя Go после проверки OTP.

Я вижу, что есть пара библиотек для этого go -saml , gosaml , go -oauth и goauth для языка программирования Go, но даже после нескольких часов поиска я не мог решить, какой из них подходит для меня. Мне не нужно реализовывать полный IDP, мне нужно только динамически создать ответ SAML.

Я нашел шаблон ответа XML, который мне нужно создать из https://www.samltool.com/generic_sso_res.php. Поэтому мне нужно создать ответ SAML, как показано ниже: -

<?xml version="1.0" encoding="UTF-8"?>
<saml1p:Response xmlns:saml1p="urn:oasis:names:tc:SAML:1.0:protocol" IssueInstant="2020-02-26T17:32:05.200Z" MajorVersion="1" MinorVersion="1" Recipient="https://im--partial.my.salesforce.com" ResponseID="_34ae7ce8-5f7fbd4d">
    <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:SignedInfo>
            <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
            <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#dsa-sha1"/>
            <ds:Reference URI="#_34ae7ce8-5f7fbd4d">
                <ds:Transforms>
                    <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
                    <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
                </ds:Transforms>
                <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
                <ds:DigestValue>fxk4drd6yhVQrJCtdfvYOyYYGAM=</ds:DigestValue>
            </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>EsjQYhFsL+Xvcgg59AkZja....8INZrTwyfLmo4+NMyYViDX6Q==</ds:SignatureValue>
        <ds:KeyInfo>
            <ds:X509Data>
                <ds:X509Certificate>MIID0zCCA5GgAwIBAgIEF...XWlGzJ3SdBlgRsdFgKyFtcxE=</ds:X509Certificate>
            </ds:X509Data>
        </ds:KeyInfo>
    </ds:Signature>
    <saml1p:Status>
        <saml1p:StatusCode Value="saml1p:Success"/>
    </saml1p:Status>
    <saml1:Assertion xmlns:saml1="urn:oasis:names:tc:SAML:1.0:assertion" AssertionID="_7f959448-5dbf311f" IssueInstant="2020-02-26T17:32:05.200Z" Issuer="AXIOM" MajorVersion="1" MinorVersion="1">
        <saml1:Conditions NotBefore="2020-02-26T17:32:05.199Z" NotOnOrAfter="2020-02-26T17:33:05.199Z">
            <saml1:AudienceRestrictionCondition>
                <saml1:Audience>https://saml.salesforce.com</saml1:Audience>
            </saml1:AudienceRestrictionCondition>
        </saml1:Conditions>
        <saml1:AuthenticationStatement AuthenticationInstant="2020-02-26T17:32:05.199Z" AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:unspecified">
            <saml1:Subject>
                <saml1:NameIdentifier>rahul.satal@xyz.com</saml1:NameIdentifier>
                <saml1:SubjectConfirmation>
                    <saml1:ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:bearer</saml1:ConfirmationMethod>
                </saml1:SubjectConfirmation>
            </saml1:Subject>
        </saml1:AuthenticationStatement>
    </saml1:Assertion>
</saml1p:Response>

, в котором мне нужно обновить только пару параметров, таких как Assertion_Id, эмитент, аудитория, получатель, тема, дата до / после, оператор атрибута, и др c. Я не уверен, нужна ли мне какая-либо библиотека для этого или я могу получить один скрипт.

1 Ответ

1 голос
/ 02 марта 2020

Эта библиотека представляется простой SAML библиотекой для Go, которая заботится о генерации SAML Response, а также о том, что Response.

. Я также видел, что это было сделано с использованием «шаблонов», где обработка SAML фактически не выполнялась. Подготовленный блок текста с заполнителями был открыт, заполнители заменены требуемым текстом и отправлен ответ.

saml1p:Response

может быть шаблоном с IssueInstant и ResponseID, созданными во время выполнения. например, псевдокод будет выглядеть следующим образом:

String samlTemplate = loadSAMLTemplate()
  .gsub("__IssueInstant__", "2020-02-26T17:32:05.200Z")
  .gsub("__ResponseID__", "9421878f98")
  .gsub( ... and so on ...)

это можно сделать таким образом, если не идеально, и это работает, только если у вас есть только один Assertion.

. Вы бы использовали Приведенный выше шаблон и замените заменяемые части заполнителями, например,

<saml1p:Response
  xmlns:saml1p="urn:oasis:names:tc:SAML:1.0:protocol"
  IssueInstant="__IssueInstant__"
  MajorVersion="1"
  MinorVersion="1"
  Recipient="https://im--partial.my.salesforce.com"
  ResponseID="__ResponseID__">

для создания XML SAML Response. У вас будут заполнители для AssertionID et c. Все, что должно быть уникальным для SAML Response, будет нуждаться в заполнителе, содержимое которого будет заменено во время выполнения.

Затем вам нужно будет подписать Response. Вы не можете сделать это, заменив вещи. Вы можете сделать это только путем цифровой подписи, используя XML Подпись. Вы можете использовать эту библиотеку , чтобы сделать это. Он по-прежнему кодирует Response, но вам нужно работать только с подписью, а не со всем процессом SAML.

Таким образом, рабочий процесс будет:

  • Создать повторно SAML Response как текстовый шаблон с PlaceHolders для каждого заменяемого текста.
  • Загрузите шаблон, замените все биты, которые необходимо заменить. Это ваша SAML Response.
  • Используйте библиотеку подписи XML для подписи SAML Response. Это то, что вы отправляете в ИП.
...