Java >> Java Tutorial >  >> Java

So fügen Sie SOAP-Header zu Request/Response hinzu

Anwendungsfall

In diesem Beitrag zeige ich, wie SOAP-Header zu SOAP-Anfragen/Antworten hinzugefügt werden. Wenn Sie über einen Code First-Webdienst ODER einen auf einem WSDL-Vertrag basierenden Webdienst verfügen, antworten Sie auf Ihre Clientanforderungen mit einer SOAP-Antwort. In meinem Fall war es ein WS-Trust-Sicherheitstoken-Webdienst, und der Endpunkt hat korrekt mit einer WS-Trust-Antwort geantwortet. Diese SOAP-Antwort enthält SAMLv1.1 ODER SAMLv2.0 Zeichen. Jetzt kann der Benutzer dieses Webdienstes entweder der Serverantwort vertrauen oder die Antwort auch auf einige Dinge wie Zeitgültigkeit, Gültigkeit der Signatur und sogar Gültigkeit des Sicherheitsheaders überprüfen.

Wenn Sie Transport Binding auf diesem Webdienst-Endpunkt unterstützen, ist es einfach. Die Antwort des Webdienstes enthält Sicherheitsheader

Aber gemäß meinem Anwendungsfall, wenn Sie lediglich UsernameToken Binding verwenden , enthält die Webdienstantwort keine Sicherheitsheader, insbesondere wenn Sie Apache CXF-Bibliotheken verwenden, fügen diese Bibliotheken nicht immer Sicherheitsheader hinzu.

Auch wenn ein Verbraucher Sicherheitsheader zu Validierungszwecken benötigt, wie fügen Sie diese Sicherheitsheader als Antwort von Ihrem Server-Endpunkt hinzu?

Lösung

In diesem speziellen Fall benötigte die Webdienst-Antwort nur einen Sicherheits-Header mit Zeitstempel.

Was ist der Sicherheitsheader und warum ist Timestamp erforderlich?

In einer SOAP-Anfrage oder -Antwort benötigen Sie Security Header-Element basierend auf der Sicherheitsrichtlinie, die der Webdienst verwenden wird. Dieser Header in einer Anfrage sieht wie folgt aus:


<wsse:Security soapenv:mustUnderstand="true" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
     <wsu:Timestamp wsu:Id="TS-D3788B6EB508E3A553155173495342917">
         <wsu:Created>2019-03-04T21:29:13.429Z</wsu:Created>
         <wsu:Expires>2019-03-04T21:30:13.429Z</wsu:Expires>
     </wsu:Timestamp>
     <wsse:UsernameToken wsu:Id="UsernameToken-6CBAAFA3A8815F71FC15511581437664">
        <wsse:Username>[email protected]</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">********</wsse:Password>
     </wsse:UsernameToken>
</wsse:Security>

Sobald ein Webservice-Endpunkt diese Anfrage erhält, validiert er den Benutzernamen und das Passwort und überprüft, ob die Gültigkeit des Zeitstempels korrekt ist. Bei erfolgreicher Validierung generiert der Webdienst eine Antwort, die auch Security enthält Header mit Timestamp . Der Verbraucher validiert diesen Zeitstempel. Ein Zeitstempel im SOAP-Header minimiert das Risiko eines Replay-Angriffs, da ein Angreifer die SOAP-Antwort nach Expiration ebenfalls nicht verwenden kann Zeit oder kann nicht einmal dieselbe Anfrage nach Expiration senden Zeit.

Wie fügen Sie diesen Sicherheitsheader des Zeitstempels hinzu, wenn Sie Apache CXF-Bibliotheken verwenden?

Apache CXF-Bibliotheken bieten einige Möglichkeiten, dies zu erreichen:

  1. JAX-WS Der Standardweg besteht darin, einen SOAP-Handler zu schreiben, der der SOAP-Nachricht Header hinzufügt. Um dies zu vereinfachen, müssen Sie den SOAP-Handler auf der Client- oder Serverseite registrieren.
  2. JAX-WS bietet einen anderen Weg durch die Anmerkung @WebParam(header = true, mode = Mode.OUT) .
  3. wsdl Der erste Weg, bei dem Sie in Ihrer WSDL-Operation SOAPHeader angeben als Teil Ihres SOAP verbindlich.
  4. CXF bietet eine eigene Möglichkeit, diese Header hinzuzufügen. In diesem Beitrag werde ich zeigen, wie Sie CXF-Bibliotheken nutzen können, um diese Header hinzuzufügen.

Wie füge ich Sicherheitsheader mit CXF-Bibliotheken hinzu?

Annahme ist, dass Sie Apache CXF-Bibliotheken verwendet haben, um den Webdienst-Endpunkt zu erstellen. JAX-WS bietet einen WebServiceContext an wodurch ein Web-Service-Endpunkt auf den Nachrichtenkontext zugreifen kann. Dieser Nachrichtenkontext kann helfen, Details für Benutzername, Passwort und andere Sicherheitsheader aus der Anfrage abzurufen.

Auf die gleiche Weise kann dieser Nachrichtenkontext verwendet werden, um eine Liste von Headern List<org.apache.cxf.headers.Header> abzurufen . Wir erstellen unseren Soap-Header für das Sicherheitselement und fügen diesen Header dann der Liste der Header hinzu. Der Code dafür sieht wie folgt aus:


SOAPFactory soapFactory = SOAPFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);

SOAPElement securityElement = soapFactory.createElement("Security",
        "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
SOAPElement timestampElement = soapFactory.createElement("Timestamp",
        "wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
timestampElement.setAttribute(WSTrustConstants.WSU_ID, "_0");

String created = getCurrentDateTime();
String expires = getCurrentDateTimePlusDelay(300L);
SOAPElement createdSOAPElement = soapFactory.createElement("Created",
        "wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
createdSOAPElement.addTextNode(created);
SOAPElement expiresSOAPElement = soapFactory.createElement("Expires",
        "wsu", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
expiresSOAPElement.addTextNode(expires);

timestampElement.addChildElement(createdSOAPElement);
timestampElement.addChildElement(expiresSOAPElement);
securityElement.addChildElement(timestampElement);
SoapHeader soapHeader = new SoapHeader(securityElement.getElementQName(), securityElement);

List<Header> headers = new ArrayList<>();
headers.add(soapHeader);
webServiceContext.getMessageContext().put(Header.HEADER_LIST, headers); 


Schlussfolgerung

In diesem Beitrag habe ich gezeigt, wie wir Apache CXF nutzen können Bibliotheken zum Hinzufügen von SOAP-Headern in einer Webdienstantwort. Ebenso können dieselben Bibliotheken verwendet werden, um diese Header der Anfrage hinzuzufügen.

Referenzen

  1. Apache CXF-Bibliotheken – Apache CXF
  2. SOAP-Header hinzufügen – SOAP-Header hinzufügen
  3. Abfangjäger – Abfangjäger


Java-Tag