我正在实施一个使用Okta作为身份提供商的SAML 2.0服务提供商。我想配置断言使用者服务(ACS)URL,以便我的服务提供者应用程序中的SAML 2.0反映在断言中。
但是,我注意到Okta身份提供程序改为发送在Okta配置中配置的SSO端点,并忽略实际发送的ACS。另外,我得到一个错误,也许SP中的ACS与那里的元数据不匹配。
如果ACS URL不是向IDP发送短ID以使其反映在断言中的正确方法,那么可以使用其他机制来实现此目的。
示例:
SP应用发送的SAML 2.0 SAMLRequest是:
assertion_consumer_service_url: https://host.com:port/saml/consume? ENTITYID = N&安培; MYNAME =用户名
Identity Provider上的配置具有元数据:
单点登录网址: https://host.com:port/saml/consume?entityId=N
请注意,myName会从一个请求更改为下一个请求,因为这是我们验证响应的name_id与发送的原始用户名相匹配的方法。
此外,如果服务提供商有办法让身份提供商断言SP管理的名称(例如用户名),那么这对我们的需求就可以了。如何指定这个?
由于
答案 0 :(得分:13)
在SAML中,假定ACS对于SP是静态的。要将Response与原始AuthnRequest相关联,您应该保存传出的AuthnRequest的ID,然后使用收到的响应的InResponseTo
。
SP可以向AuthnRequest添加主题,告诉IdP您要通过哪个用户名进行身份验证。它在SAML2 Core spec中的3.4.1节中定义。
答案 1 :(得分:0)
正如Anders Abel指出的那样,ACS被认为是静态的。但是,在开发环境中,可能有必要对不同的测试系统做出更动态的响应。
这是我的saml20-sp-remote.php,我使用它的请求的属性AssertionConsumerService
来响应每个请求SSO身份验证的SP。
我猜这对于生产来说是不安全的。
simplesamlphp / metadata / saml20-sp-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'
);