@@ -782,6 +782,39 @@ def test_logout_service_global(self):
782782 "Not a valid Response" ,
783783 )
784784
785+ @override_settings (LOGOUT_REDIRECT_URL = "/dashboard/" )
786+ def test_post_logout_redirection (self ):
787+ settings .SAML_CONFIG = conf .create_conf (
788+ sp_host = "sp.example.com" ,
789+ idp_hosts = ["idp.example.com" ],
790+ metadata_file = "remote_metadata_one_idp.xml" ,
791+ )
792+
793+ self .do_login ()
794+
795+ response = self .client .get (reverse ("saml2_logout" ))
796+ self .assertEqual (response .status_code , 302 )
797+
798+ # now simulate a logout response sent by the idp
799+ expected_request = """<samlp:LogoutRequest xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="XXXXXXXXXXXXXXXXXXXXXX" Version="2.0" Destination="https://idp.example.com/simplesaml/saml2/idp/SingleLogoutService.php" Reason=""><saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">http://sp.example.com/saml2/metadata/</saml:Issuer><saml:NameID SPNameQualifier="http://sp.example.com/saml2/metadata/" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">1f87035b4c1325b296a53d92097e6b3fa36d7e30ee82e3fcb0680d60243c1f03</saml:NameID><samlp:SessionIndex>a0123456789abcdef0123456789abcdef</samlp:SessionIndex></samlp:LogoutRequest>"""
800+
801+ request_id = re .findall (r' ID="(.*?)" ' , expected_request )[0 ]
802+ instant = datetime .datetime .now ().strftime ("%Y-%m-%dT%H:%M:%SZ" )
803+
804+ saml_response = """<?xml version='1.0' encoding='UTF-8'?>
805+ <samlp:LogoutResponse xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" Destination="http://sp.example.com/saml2/ls/" ID="a140848e7ce2bce834d7264ecdde0151" InResponseTo="{}" IssueInstant="{}" Version="2.0"><saml:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://idp.example.com/simplesaml/saml2/idp/metadata.php</saml:Issuer><samlp:Status><samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success" /></samlp:Status></samlp:LogoutResponse>""" .format (
806+ request_id , instant
807+ )
808+
809+ response = self .client .get (
810+ reverse ("saml2_ls" ),
811+ {
812+ "SAMLResponse" : deflate_and_base64_encode (saml_response ),
813+ },
814+ )
815+ self .assertRedirects (response , "/dashboard/" )
816+ self .assertListEqual (list (self .client .session .keys ()), [])
817+
785818 def test_incomplete_logout (self ):
786819 settings .SAML_CONFIG = conf .create_conf (
787820 sp_host = "sp.example.com" , idp_hosts = ["idp.example.com" ]
0 commit comments