SimpleSamlPhp 作为 SP 重定向不正确
Posted
技术标签:
【中文标题】SimpleSamlPhp 作为 SP 重定向不正确【英文标题】:SimpleSamlPhp as SP redirects incorrectly 【发布时间】:2014-11-05 07:19:58 【问题描述】:我有一个作为服务提供者工作的 SimpleSamlphp 实现,所以工作流程如下:
IdP 将断言发送到我的 ACS URL:
/simplesaml/module.php/saml/sp/saml2-acs.php/default-sp
但是看起来他进行了身份验证并被重定向到
/simplesaml/module.php/saml/sp/saml2-acs.php
这会引发错误,因为没有指定 authsource(/default-sp 部分):
SimpleSAML_Error_Error: UNHANDLEDEXCEPTION
Backtrace:
0 *\simplesamlphp\www\module.php:180 (N/A)
Caused by: SimpleSAML_Error_Exception: No authentication source with id false found.
Backtrace:
2 *\simplesamlphp\lib\SimpleSAML\Auth\Source.php:242 (SimpleSAML_Auth_Source::getById)
1 *\simplesamlphp\modules\saml\www\sp\saml2-acs.php:8 (require)
0 *\simplesamlphp\www\module.php:135 (N/A)
但是,它也有一组 PHP 错误输出到页面:
Warning: array_key_exists(): The first argument should be either a string or an integer in *\simplesamlphp\lib\SimpleSAML\Configuration.php on line 314
Warning: Cannot modify header information - headers already sent by (output started at *\simplesamlphp\lib\SimpleSAML\Configuration.php:314) in *\simplesamlphp\lib\SimpleSAML\Error\Error.php on line 191
Warning: Cannot modify header information - headers already sent by (output started at *\simplesamlphp\lib\SimpleSAML\Configuration.php:314) in *\simplesamlphp\templates\includes\header.php on line 40
(我已经把目录路径去掉了,换成了*——这不正常)
我无法确定这是 SimpleSamlPHP 的错误还是(更可能)设置不正确。我的 authsources 和元数据如下:
saml20-idp-remote.php:
$metadata['https://app.onelogin.com/saml/metadata/391645'] = array(
'name' => 'FSSO',
'SingleSignOnService' => 'https://app.onelogin.com/trust/saml2/http-post/sso/391645',
'AssertionConsumerservice' => 'https://www.fbjni.com/simplesaml/module.php/saml/sp/saml2-acs.php/default-sp',
'SingleLogoutService' => 'https://www.fbjni.com/simplesaml/module.php/saml/sp/saml2-logout.php/default-sp',
'certData' => '[rawCertificateData]'
);
authsources.php:
'default-sp' => array(
'saml:SP',
'RelayState' => 'https://www.fbjni.com/',
'entityID' => 'https://app.onelogin.com/saml/metadata/391645',
),
【问题讨论】:
【参考方案1】:您的 IdP 元数据可能存在一些问题。 SimpleSAMLphp 包含一个元数据解析器,它负责将 IdP 配置详细信息转换为 SimpleSAMLphp 所需的格式。此处的 SimpleSAMLphp 文档中简要提到了此功能:https://simplesamlphp.org/docs/1.8/simplesamlphp-sp#section_2
根据您上面的示例,您应该能够在https://www.fbjni.com/simplesaml/admin/metadata-converter.php
访问元数据解析器。
在您上面的特定示例中,从 https://app.onelogin.com/saml/metadata/391645
下载 OneLogin 元数据,并将此 XML 复制到 SimpleSAMLphp 安装中的元数据解析器中。
转换元数据后,将上面现有的 IdP 配置替换为元数据解析器的输出,看起来应该更像这样:
$metadata['https://app.onelogin.com/saml/metadata/391645'] = array (
'entityid' => 'https://app.onelogin.com/saml/metadata/391645',
'contacts' =>
array (
0 =>
array (
'contactType' => 'technical',
'surName' => 'Support',
'emailAddress' =>
array (
0 => 'support@onelogin.com',
),
),
),
'metadata-set' => 'saml20-idp-remote',
'SingleSignOnService' =>
array (
0 =>
array (
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
'Location' => 'https://app.onelogin.com/trust/saml2/http-post/sso/391645',
),
1 =>
array (
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
'Location' => 'https://app.onelogin.com/trust/saml2/http-post/sso/391645',
),
2 =>
array (
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:SOAP',
'Location' => 'https://app.onelogin.com/trust/saml2/soap/sso/391645',
),
),
'SingleLogoutService' =>
array (
),
'ArtifactResolutionService' =>
array (
),
'keys' =>
array (
0 =>
array (
'encryption' => false,
'signing' => true,
'type' => 'X509Certificate',
'X509Certificate' => 'MIIEJjCCAw6gAwIBAgIUHyryf8tYCgBMvr2nihtEA3NFrQEwDQYJKoZIhvcNAQEF
BQAwXTELMAkGA1UEBhMCVVMxFjAUBgNVBAoMDUZhY2Vib29rIFRlc3QxFTATBgNV
BAsMDE9uZUxvZ2luIElkUDEfMB0GA1UEAwwWT25lTG9naW4gQWNjb3VudCA0MDA1
ODAeFw0xNDAzMjYwMzA2NDNaFw0xOTAzMjcwMzA2NDNaMF0xCzAJBgNVBAYTAlVT
MRYwFAYDVQQKDA1GYWNlYm9vayBUZXN0MRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAx
HzAdBgNVBAMMFk9uZUxvZ2luIEFjY291bnQgNDAwNTgwggEiMA0GCSqGSIb3DQEB
AQUAA4IBDwAwggEKAoIBAQDjmCU+PbTPgsjgffG2cqTBzVTYOx80L07ZO2tGaqry
oCXJctP9fEcFleamose/+mg052wxStd84FpHwa2JC7sbHNeMIaBbA3b1XzFgNVJy
D2KjJK17ftYTm8EprtDPuCiMyHI3P2XGuz+i9BonxhUodgITa9FELqKAJU1GKtsJ
r4saGVlpYZgU9InYlGNohdkFfkbPSRiUeQoRhKYtYmM74maL7aGdXvSyXmUaa+n6
rl6MTMUCJj8tfs2CwqT1Ktc1wZTBRWUXcxi/02IP9AVXghhLcE1ES1tFV58FsvNN
Dtpigg9PFnRwAoC0HSMVEYh3VBx+TROqyGmM74i1yJGvAgMBAAGjgd0wgdowDAYD
VR0TAQH/BAIwADAdBgNVHQ4EFgQU11p7PgInyRe7dHHUQMrbBfka8+cwgZoGA1Ud
IwSBkjCBj4AU11p7PgInyRe7dHHUQMrbBfka8+ehYaRfMF0xCzAJBgNVBAYTAlVT
MRYwFAYDVQQKDA1GYWNlYm9vayBUZXN0MRUwEwYDVQQLDAxPbmVMb2dpbiBJZFAx
HzAdBgNVBAMMFk9uZUxvZ2luIEFjY291bnQgNDAwNTiCFB8q8n/LWAoATL69p4ob
RANzRa0BMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQUFAAOCAQEAv9Cwtv6V
ov6heh5b/u+hsFk9Lhva/jzOgbYAblWxDTgsvcehbYeZSO3XTqq5I3qx9XCqet4a
FdUetFMPk/cpcl9GahHhagvScn+ClbHVnrakRt/1/oDcrxi+6l+GT7yzg7MPoj6C
AIjmVdPhbWRiU3on6PkG95pfDq/hasCTHS3kVUJlv+Ge2rdiiIyVJmlak24UQVuN
2DznvY5jlUOIXXtCTLttu7YY5z9V0pSa0MdWDL3/mokGIjydR2DdHfkgyk2syjny
4+9ohie+oLKz1rv9OcAv+90WAYaltDoTSMYSG9W2rjeDh2NHYFuWxXOi08FPZfXo
DFLPLA0yYeSkFA==',
),
),
);
此外,您应该对 authsources.php 配置进行一些更改。您的 SP 的“entityID”通常是您的应用程序的 URL,而不是您选择的 IdP 的标识符。您可以为 SP 指定默认 IdP,如下所示:
'default-sp' => array(
'saml:SP',
'entityID' => 'https://www.fbjni.com/',
'RelayState' => 'https://www.fbjni.com/',
'idp' => 'https://app.onelogin.com/saml/metadata/391645'
),
【讨论】:
那么如果“entityID”是应用程序的 URL,为什么 SimpleSAMLphp 会重定向回它自己的测试页面——即使我已将 entityID 设置为我的应用程序的 url?我正在尝试查看我是否正确设置了此设置,并且由于它忽略了 entityID 设置,因此我不知道我是否正确执行此操作。似乎也找不到任何好的教程。 一些应用程序假设服务提供者的 entityID 与访问服务提供者的 URL 相同,因此为什么“entityID”通常是您的应用程序,因为这似乎是一个常见的约定 - 但这不是必需的。从技术上讲,entityID 实际上是一个 URI 而不是 URL。以下 Stack Overflow 答案进一步详细说明了这一点:***.com/a/24199710/4065014。您的实体 ID 可以是您喜欢的任何东西 - 它是您的 SP 的唯一标识符。将 RelayState 设置为应用程序的 URL。 谢谢格伦。很有帮助。以上是关于SimpleSamlPhp 作为 SP 重定向不正确的主要内容,如果未能解决你的问题,请参考以下文章
Simplesamlphp IdP 登录后重定向到错误的 url
在 symfony 中使用 SimpleSAMLphp 和 composer
SimpleSAMLPHP SP 和 ADFS IDP 的 Requester/InvalidNameIDPolicy 错误