Впервые пытаюсь внедрить SAML в качестве SP. Мы решили попробовать использовать SimpleSAMLphp с нашей специальной платформой MVC, так как решили, что это сэкономит нам время.
У меня проблема в том, что я попадаю в бесконечный цикл или атрибуты пусты.
Я настроил свои метаданные и протестировал их из интерфейса аутентификации в SimpleSAMLphp. У idP есть установленный URL-адрес обратной передачи, который отличается от того, с которого мы начали, поэтому:
- Пользователь нажимает domain.com/sso Мы создаем новый экземпляр
SimpleSAML_Auth_Simple('our-configured-sp')
- Звоните
$as->requireAuth()
- Клиент перенаправляется на idP
- IDP перенаправляет пользователя обратно на domain.com/sso/saml
Если мы это сделаем, нам придется создать новый экземпляр, используя тот же код (например, $as = new SimpleSAML_Auth_Simple('our-configured-sp')
), и когда мы сделаем $as->getAttributes()
, это будет пустой массив. Мы используем phpsession
store.type
, но когда я смотрю на файлы cookie в домене, я вижу только PHPSESSID
и SimpleSAMLAuthToken
Поэтому мы попытались объединить все это в один метод. Как и выше, только вы начинаете с domain.com/sso/saml, за исключением того, что на этот раз цикл повторяется снова и снова. Пользователь попадает в наш домен, перенаправляется на idP, затем перенаправляется обратно к нам, затем снова к idP, и так до бесконечности.
В конце концов я сдался. Я могу получить ответ в $_POST['SAMLResponse']
и могу base64_decode()
посмотреть, что там написано. Я поместил его в объект SimpleXMLElement
и смог с ним работать. Проблема в том, что данные зашифрованы, и теперь я застрял, пытаясь их расшифровать.
У меня есть данные в этих узлах, но я не знаю, что с ними делать:
- samlp:Response->saml:EncryptedAssertion->EncryptedData->KeyInfo->EncryptedKey->X509Data->X509Certificate
- samlp:Response->saml:EncryptedAssertion->EncryptedData->KeyInfo->EncryptedKey->CipherData->CipherValue
- samlp:Response->saml:EncryptedAssertion->EncryptedData->CipherData->CipherValue
Я не знаю, как использовать каждый из них, хотя могу убедиться, что X509Certificate
является открытым ключом, соответствующим моему закрытому ключу. Я пытался декодировать различные значения, используя разные ключи (или то, что я считал ключами), но безрезультатно.
- samlp:Response->saml:EncryptedAssertion->EncryptedData->KeyInfo->EncryptedKey->EncryptionMethod предлагает
RSA1_5
- samlp:Response->saml:EncryptedAssertion->EncryptedData->EncryptionMethod предлагает
AES256-CBC
(я пробовалmcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $data, "cbc", $iv);
, хотя на самом деле не могу понять, что я должен поместить в$key
или$data
)
В идеале я хотел бы, чтобы он полностью работал в SimpleSAMLphp, но я, честно говоря, понятия не имею, в чем проблема, поэтому я не знаю, как ее отсортировать. Метаданные выглядят так:
$metadata = array(
'https://partner.com' => array(
'SingleSignOnService' => 'https://partner.com/sso/response',
'SingleLogoutService' => 'https://partner.com/sso/slo',
'assertion.encryption' => true,
'certificate' => partner.cer'
)
);
В авторских источниках есть это:
$config = array(
'our-configured-sp' => array(
'saml:SP',
'privatekey' => 'my.private.pem',
'certificate' => 'my.public.cert',
'idp' => 'https://partner.com',
'baseurlpath' => 'simplesaml/',
)
);
Любая помощь? Предпочтительно, чтобы все это работало с SimpleSAMLphp, но если нет, я бы взял небольшое руководство о том, как расшифровать файл.
Всем спасибо