OneLogin php saml - проблемы с ответом SAML - PullRequest
3 голосов
/ 06 марта 2019

Я подключил OneLogin с помощью php-saml для подключения к нашей службе idp. В нашей промежуточной среде все отлично работает с настройками, которые мы используем.

Однако я столкнулся с проблемой использования тех же файлов в нашей производственной среде.

Проблема в том, что ответ SAML неправильно проверяется схемой saml-schema-protocol-2.0.xsd и выдает ошибки об этом.

$settingsInfo = array(
    'strict' => true,
    'debug' => false,
    'sp' => array(
        'entityId' => 'website',
        'assertionConsumerService' => array(
            'url' => "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'],
            'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
        ) ,
        'NameIDFormat' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified',
        'x509cert' => file_get_contents('tool-sso.pem', FILE_USE_INCLUDE_PATH) ,
        'privateKey' => file_get_contents('tool-sso.key', FILE_USE_INCLUDE_PATH) ,
    ) ,
    'idp' => array(
        'entityId' => 'https://sso.example.com',
        'singleSignOnService' => array(
            'url' => 'https://sso.example.com/idp/SSO.saml2',
            'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
        ) ,
        'singleLogoutService' => array(
            'url' => 'https://sso.example.com/idp/SSO.saml2',
            'binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
        ) ,
        'x509cert' => file_get_contents('sso.pem', FILE_USE_INCLUDE_PATH)
    ) ,
    'compress' => array(
        'requests' => true,
        'responses' => true
    ) ,
    'security' => array(
        'authnRequestsSigned' => true,
        'signatureAlgorithm' => 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256',
    )
);

Однако, если я добавлю следующую строку в настройки безопасности, она будет работать нормально:

'wantXMLValidation' => false

Это заставляет меня думать, что ответ SAML, который мы получаем от idp, как-то не в ожидаемом формате, как определено в xsd.

Есть мысли о том, что может вызвать сбой wantXMLValidation=true? Это связано с отсутствием / дополнительными / неверными данными в ответе SAML или может быть проблема с тем, как мы отправляем данные?

Я пытаюсь исключить проблему с idp, но для того, чтобы синхронизировать наши промежуточные и производственные среды, я хочу, чтобы для этого флага wantXMLValidation было установлено значение true.

Я попытался запустить ответ для Validate XML with the XSD schema инструмента , и он возвращается как действительный xml.

Конкретная ошибка, которую я получаю, когда включена проверка XML, выглядит следующим образом:

    Warning: DOMDocument::schemaValidate(): Invalid Schema in \\fileshare\root\resources\Classes\OneLogin\src\Saml2\Utils.php on line 135 failed to load external entity "/fileshare/root/resources/Classes/OneLogin/src/Saml2/schemas/xmldsig-core-schema.xsd" Element '{http://www.w3.org/2001/XMLSchema}import': Failed to locate a schema at location '/fileshare/root/resources/Classes/OneLogin/src/Saml2/schemas/xmldsig-core-schema.xsd'. Skipping the import. failed to load external entity "/fileshare/root/resources/Classes/OneLogin/src/Saml2/schemas/xenc-schema.xsd" Element '{http://www.w3.org/2001/XMLSchema}import': Failed to locate a schema at location '/fileshare/root/resources/Classes/OneLogin/src/Saml2/schemas/xenc-schema.xsd'. Skipping the import. Element '{http://www.w3.org/2001/XMLSchema}element', attribute 'ref': The QName value '{http://www.w3.org/2001/04/xmlenc#}EncryptedData' does not resolve to a(n) element declaration. Element '{http://www.w3.org/2001/XMLSchema}element', attribute 'ref': The QName value '{http://www.w3.org/2001/04/xmlenc#}EncryptedKey' does not resolve to a(n) element declaration. Invalid SAML Response. Not match the saml-schema-protocol-2.0.xsd
invalid_response

OneLogin\Saml2\Auth Object
(
    [_settings:OneLogin\Saml2\Auth:private] => OneLogin\Saml2\Settings Object

Окружающая среда:

Моя установка представляет собой балансировщик нагрузки с двумя серверами Windows и одним общим файловым ресурсом. Пользователь подключается к LB, веб-сервер, на котором работает PHP, вызывает файлы PHP onelogin из общей папки (не на том же сервере, что и веб-серверы). Единственная причина, по которой я это поднимаю, заключается в том, что мне интересно, есть ли какое-то отношение к тому, как schemaLocations пытается прочитать файлы .xsd.

Обновление:

Возможно, я понял это, но не лучший способ это исправить.

В файле OneLogin Utils.php есть функция validateXML, которая загружает файл схемы, с которым сравнивается ответ SAML. После некоторой пробной ошибки я переместил файлы схемы непосредственно на веб-сервер, а не на общий файловый ресурс. После их перемещения и жесткого определения местоположения этих файлов схемы проблема будет решена.

public static function validateXML($xml, $schema, $debug = false)
    {
        assert(is_string($xml) || $xml instanceof DOMDocument);
        assert(is_string($schema));

        libxml_clear_errors();
        libxml_use_internal_errors(true);

        if ($xml instanceof DOMDocument) {
            $dom = $xml;
        } else {
            $dom = new DOMDocument;
            $dom = self::loadXML($dom, $xml);
            if (!$dom) {
                return 'unloaded_xml';
            }
        }

        //$schemaFile = __DIR__ . '/schemas/' . $schema;
        $schemaFile = 'file://C:\inetpub\wwwroot\config\schemas\\'. $schema;

До этого изменения файл схемы искал бы файловый ресурс для этого xsd.

Я не уверен, является ли это проблемой с путём, когда libXML не может читать такой каталог или его разрешения и т. Д.

Я бы предпочел располагать схемы в той же папке, что и OneLogin, и не ссылаться на них с самого веб-сервера.

Что-нибудь выделяется среди моих путей, которые я мог бы здесь упустить?

...