SAML 2.0: как настроить URL-адрес службы поддержки

Я внедряю поставщика услуг SAML 2.0, который использует Okta в качестве поставщика удостоверений. Я хотел бы настроить URL Assertion Consumer Service (ACS) так, чтобы SAML 2.0 из моего приложения-поставщика услуг отразился в утверждении.

Однако я замечаю, что поставщик Okta Identity вместо этого отправляет конечную точку единого входа, настроенную в конфигурации Okta, и игнорирует фактически отправленную ACS. Кроме того, я получаю ошибку, возможно, ACS из SP не соответствует там метаданным.

Если URL-адрес ACS не подходит для отправки короткого идентификатора IDP для его отражения в утверждении, какой другой механизм может быть использован для этой цели.

Пример:

SAML 2.0 SAMLRequest, отправленный приложением SP:

assertion_consumer_service_url: https://host.com:port/saml/consume? EntityId = N & Myname = имя пользователя

Конфигурация в Identity Provider имеет метаданные:

Единый входной URL: https://host.com:port/saml/consume?entityId=N

Обратите внимание, что myName изменяется от одного запроса к другому, так как это наш способ проверить, что ответ имеет имя_ид, которое соответствует отправленному исходному имени пользователя.

Кроме того, если поставщик услуг позволяет провайдеру удостоверения утверждать, что имя, управляемое SP (например, имя пользователя), это будет хорошо для наших нужд. Как это указать?

Спасибо

Ответ 1

В SAML предполагается, что ACS является статическим для SP. Чтобы соотнести ответ с исходящим запросом AuthnRequest, необходимо сохранить идентификатор исходящего запроса AuthnRequest, а затем использовать InResponseTo полученного ответа.

SP может добавить тему в AuthnRequest, сообщив IdP, какое имя пользователя вы хотите аутентифицировать. Это определено в разделе 3.4.1 в спецификации ядра SAML2.

Ответ 2

Как отметил Андерс Абель, ACS считается статическим. Однако в среде разработки может потребоваться более динамичный отклик на разные тестовые системы.

Это мой saml20-sp-remote.php, который я использую для ответа каждому SP, который запрашивает SSO-аутентификацию, используя атрибут AssertionConsumerService своих запросов. Я думаю, что это не безопасно для производства.

simplesamlphp/метаданные /saml20-зр-remote.php:

<?php
/**
 * SAML 2.0 remote SP metadata for SimpleSAMLphp.
 *
 * See: https://simplesamlphp.org/docs/stable/simplesamlphp-reference-sp-remote
 */
$acs = \SAML2\Binding::getCurrentBinding()->receive()->getAssertionConsumerServiceURL();
if (!$acs) $acs = 'some_fallback_url';

$metadata['idp_identifier'] = array(
    'AssertionConsumerService' => $acs,
    'simplesaml.nameidattribute' => 'uid'
);