所以我需要从我的ServiceProvider用SimpleSAMLphp发出的SLO请求发送到OKTA IDP。
我尝试过SimpleSAMLphp的注销功能,但他们只在ServiceProvider上注销,而不是在我的IDP上。。。
使用的代码:
require_once('/var/www/service_provider/simplesamlphp/lib/_autoload.php');
$as = new SimpleSAML_Auth_Simple('default-sp');
$as->logout();
我试图在logout((函数中添加参数我的IDP的SLO url,但在请求中缺少一些参数,并且没有关于如何生成这个缺少的参数的文档。。。
谢谢你的帮助!
致问候,
编辑:
我将我的authsources配置为:
'default-sp' => [
'saml:SP',
'entityID' => null,
'idp' => 'http://www.okta.com/ID',
'discoURL' => null,
'privatekey' => 'sp.pem',
'certificate' => 'sp.crt',
'sign.logout' => true,
'sign' => [
'logout' => true
]
],
编辑:
IDP元数据:
$metadata['http://www.okta.com/randomString'] = array (
'entityid' => 'http://www.okta.com/randomString',
'contacts' =>
array (
),
'metadata-set' => 'saml20-idp-remote',
'SingleSignOnService' =>
array (
0 =>
array (
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
'Location' => 'https://okta/app/okta_test_1/randomString/sso/saml',
),
1 =>
array (
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
'Location' => 'https://okta/app/okta_test_1/randomString/sso/saml',
),
),
'SingleLogoutService' =>
array (
0 =>
array (
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST',
'Location' => 'https://okta/app/okta_test_1/randomString/slo/saml',
),
1 =>
array (
'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
'Location' => 'https://okta/app/okta_test_1/randomString/slo/saml',
),
),
'ArtifactResolutionService' =>
array (
),
'NameIDFormats' =>
array (
0 => 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified',
1 => 'urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress',
),
'keys' =>
array (
0 =>
array (
'encryption' => false,
'signing' => true,
'type' => 'X509Certificate',
'X509Certificate' => 'certValue',
),
),
);
您需要首先在Okta应用程序中启用注销。这将需要您的服务提供商的公共证书,因为Okta希望对注销请求进行签名。
一旦您启用了登出,Okta IdP的SAML元数据就会更改为包括登出URL。您需要更新SSP中的元数据,以便SSP了解Okta的注销url。
最后,您需要启用SSP的签名注销消息。您可以使用authsources.php
中的'sign.logout' => true
选项来执行此操作
所以最后我错过了在注销脚本中启动会话的错误。所以SimpleSAMLPHP从来没有找到当前会话,比如建议Patrick在评论中isAuthenticated总是假的。
因此,为了纠正我在注销脚本开始时的错误,我使用了
session_start();
这是有效的!