"State information lost" 在 SimpleSamlphp 中

"State information lost" in SimpleSamlphp

我在 SimpleSamlphp 中收到错误状态信息丢失 "State information lost"。 使用 sprint-security 作为 SP,并在 Simplesamlphp 上配置 Idp。 然后,浏览器将SP网页重定向到Idp就可以了,但是登录用户名和密码后,就报错了, "State information lost"。 ```

Apr 19 08:52:28 simplesamlphp DEBUG [bc5df4b2c1] array (
  'id' => 'a3a41e7aia439d7371j5e742e35jhi',
  'url' => NULL,
)
Apr 19 08:52:28 simplesamlphp DEBUG [bc5df4b2c1] Ron====sid===end
Apr 19 08:52:28 simplesamlphp DEBUG [bc5df4b2c1] NULL
Apr 19 08:52:28 simplesamlphp DEBUG [bc5df4b2c1] Ron====url===end
Apr 19 08:52:28 simplesamlphp DEBUG [bc5df4b2c1] Ron====state:NULL
Apr 19 08:52:28 simplesamlphp ERROR [bc5df4b2c1] SimpleSAML_Error_NoState: NOSTATE
Apr 19 08:52:28 simplesamlphp ERROR [bc5df4b2c1] Backtrace:
Apr 19 08:52:28 simplesamlphp ERROR [bc5df4b2c1] 2 /var/simplesamlphp/lib/SimpleSAML/Auth/State.php:274 (SimpleSAML_Auth_State::loadState)
Apr 19 08:52:28 simplesamlphp ERROR [bc5df4b2c1] 1 /var/simplesamlphp/modules/saml/www/sp/saml2-acs.php:91 (require)
Apr 19 08:52:28 simplesamlphp ERROR [bc5df4b2c1] 0 /var/simplesamlphp/www/module.php:137 (N/A)
Apr 19 08:52:28 simplesamlphp ERROR [bc5df4b2c1] Error report with id f9c150bb generated.

``` 我发现 stateID 是由 SP 发送的。然后在 Idp 端,现在日志显示会话包含一个 phpsession 的两个有效 cookie 和一个 authtoken。但是这两个Id都无法匹配响应中的"RequestId"或"InResponseTo"。 我只是被困在这里。它是如何发生的?任何人都可以帮忙吗?提前致谢。

我发现 php 的逻辑在我的案例中遵循 SP php 脚本,更明显的是,当我手动更改 "stateId" 时,我得到了像这样的错误: SimpleSAML_Error_Exception:此 SP [https://domainname/simplesaml/module.php/saml/sp/metadata.php/default-sp] 不是断言的有效受众。候选人是:[com:vdenotaris:spring:sp]

这很奇怪,出乎我的意料。然后我检查了文件 "metadata/saml20-sp-remote.php" SimpleSAMLphp 文档说这是为了将 SP 元数据添加到 Idp 配置中以让它知道。 最后,我发现我在这里填充了错误的 SP 元数据。 这样就出错了:

$metadata['com:vdenotaris:spring:sp'] = array(
        'AssertionConsumerService' => 'https://domainname/simplesaml/module.php/saml/sp/saml2-acs.php/default-sp',
        'SingleLogoutService' => 'https://domainname/simplesaml/module.php/saml/sp/saml2-logout.php/default-sp',
);

应为 AssertionConsumerService 和 SingleLogoutService 分配 SP 中的 URL,因为它们是 SP 上的服务。 所以应该是这样的:

$metadata['com:vdenotaris:spring:sp'] = array(
        'AssertionConsumerService' => 'https://SPonRonSever:8443/prj/saml/SSO',
        'SingleLogoutService' => 'https://SPonRonSever:8443/prj/saml/SingleLogout',
);

然后当你在浏览器地址栏中输入“https://SPonRonSever:8443/prj”时,它会跳转到Idp提供的登录页面,通过身份验证后,你就可以访问你想要的网页了。