2015-07-01 13 views
13

Es macht meinen Kopf in .... Was fehlt mir hier ... muss etwas mit dem Timestamp sein, denn wenn ich mit denen spiele bekomme ich verschiedene Fehler ...WS-Trust authentifiziert nicht mit PHP

ich habe den folgenden Umschlag bekomme (das ist, wie der Anbieter es gab mir zu verwenden) Aber es keepis mir

geben
<s:Body> <s:Fault> <s:Code> <s:Value> s:Sender</s:Value> <s:Subcode> <s:Value xmlns:a="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> a:InvalidSecurity</s:Value> </s:Subcode> </s:Code> <s:Reason> <s:Text xml:lang="en-US"> An error occurred when verifying security for the message.</s:Text> </s:Reason> </s:Fault> </s:Body> 

dies ist mein Code:

$c = $this->getTimestamp(); 
    $e = $this->getTimestamp(300); 


$envelope = ' 
     <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
     <s:Header> 
      <a:Action s:mustUnderstand="1">http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue</a:Action> 
      <a:MessageID>urn:uuid:4137dbed-db9f-40d9-ba9c-6fc82eb8aa46</a:MessageID> 
      <a:ReplyTo> 
       <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> 
      </a:ReplyTo> 
      <a:To s:mustUnderstand="1">https://sts.service.net/adfs/services/trust/13/usernamemixed</a:To> 
      <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
       <u:Timestamp u:Id="_0"> 
        <u:Created>'.$c.'</u:Created> 
        <u:Expires>'.$e.'</u:Expires> 
       </u:Timestamp> 
       <o:UsernameToken u:Id="uuid-4137dbed-db9f-40d9-ba9c-6fc82eb8aa46"> 
        <o:Username>'.$username.'</o:Username> 
        <o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">'.$password.'</o:Password> 
       </o:UsernameToken> 
      </o:Security> 
     </s:Header> 
     <s:Body> 
      <trust:RequestSecurityToken xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512"> 
       <wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"> 
        <wsa:EndpointReference xmlns:wsa="http://www.w3.org/2005/08/addressing"> 
         <wsa:Address>'.$appliesTo.'</wsa:Address> 
        </wsa:EndpointReference> 
       </wsp:AppliesTo> 
       <trust:KeyType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer</trust:KeyType> 
       <trust:RequestType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue</trust:RequestType> 
      </trust:RequestSecurityToken> 
     </s:Body> 
     </s:Envelope> 
     '; 


     $soap_do = curl_init(); 
     curl_setopt($soap_do, CURLOPT_URL,"https://sts.service.net/adfs/services/trust/13/usernamemixed"); 
     curl_setopt($soap_do, CURLOPT_FOLLOWLOCATION, 1); 
     curl_setopt($soap_do, CURLOPT_HEADER, 0); 
     curl_setopt($soap_do, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($soap_do, CURLOPT_CONNECTTIMEOUT, 20); 
     curl_setopt($soap_do, CURLOPT_TIMEOUT,  20); 
     curl_setopt($soap_do, CURLOPT_SSL_VERIFYPEER, 0); 
     curl_setopt($soap_do, CURLOPT_SSL_VERIFYHOST, 0); 
     curl_setopt($soap_do, CURLOPT_POST,   true);    
     curl_setopt($soap_do, CURLOPT_POSTFIELDS,  $envelope); 
     curl_setopt($soap_do, CURLOPT_HTTPHEADER,  array('Content-Type: application/soap+xml; charset=utf-8')); 

     $this->payload = curl_exec($soap_do); 

Antwort

9

Sie setzen den aktuellen Zeitstempel sowohl in das Element Created als auch in das Element Expires. Das heißt, wenn der Empfänger die RST empfängt, ist die Nachricht abgelaufen und der Empfänger wird gezwungen, sie abzulehnen. Verwenden Sie z .:

gmdate("Y-m-d\TH:i:s\Z", time() + 300); 

für das Expires Element.

Überprüfen Sie auch auf Uhr Drift: die Zeit auf dem Client sowie der Server sollte synchronisiert werden.

Last but not least: Standardmäßig wird ADFS 2.0 versuchen, das Token in der Antwort zu verschlüsseln, sodass die Konfiguration eines Verschlüsselungszertifikats für die vertrauende Partei erforderlich ist. Stellen Sie sicher, dass Sie eine für die mit appliesTo verknüpfte Entität konfiguriert haben. Die ADFS-Fehlerprotokolle sollten Ihnen einen Hinweis auf diesen Fehler geben.

+0

Das ist nicht das Problem lösen. Ich habe versucht, mit den Zeitstempeln – renevdkooi

+0

Kommentar über die synchronisierte Zeit –

+0

und einen Kommentar über das Verschlüsselungszertifikat zu spielen; Ansonsten ist der Code in Ordnung und funktioniert für mich –

0

Ich habe Folgendes getan, um das Problem zu beheben. Ich habe die CURRENT_TIME geändert - 300 Sekunden, und CURRENT_TIME + 3.600 Sekunden

Es funktioniert