2012-04-13 7 views
1

Ich versuche gerade, eine Verbindung zur hmrc-API herzustellen, habe einen Dienst in meinem Projekt eingerichtet und bin gerade dabei, die zu sendende Nachricht zu erstellen.Hinzufügen von wsse: Sicherheitselement zu Soap-Header

Ich war in der Lage, den Hauptteil der Nachricht zu erstellen, aber habe Probleme, die Kopfzeile richtig zu bekommen. Hier ist ein Beispiel dafür, wie die Nachricht aussehen sollte:

<soap:Envelope 
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing" 
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-wsswssecurity-utility-1.0.xsd" 
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
<soap:Header>  
<wsa:Action>http://schemas.xmlsoap.org/ws/2004/04/security/trust/RST/Issue</wsa:Action> 
<wsa:MessageID>uuid:39610e5b-162b-4491-9301-85578046a583</wsa:MessageID> 
<wsa:ReplyTo> 
    <wsa:Address> 
     http://schemas.xmlsoap.org/ws/2004/03/addressing/role/anonymous 
    </wsa:Address> 
</wsa:ReplyTo> 
<wsa:To> 
    http://www.gateway.gov.uk/soap/2007/02/sts 
</wsa:To> 
<wsse:Security> 
    <wsu:Timestamp wsu:Id="Timestamp-201ebb7a-d2f4-44d5-85e4-b8bb4c71ed54"> 
    <wsu:Created>2012-04-13T16:18:11Z</wsu:Created> 
    <wsu:Expires>2012-04-13T16:23:11Z</wsu:Expires> 
    </wsu:Timestamp> 
</wsse:Security> 
</soap:Header> 
<soap:Body> 
<wst:RequestSecurityToken xmlns:wst="http://schemas.xmlsoap.org/ws/2004/04/trust"> 
<wst:TokenType>urn:GSO-SystemServices:external:1.65:gatewaytoken#GatewayToken</wst:TokenType>  
<wst:RequestType>http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue</wst:RequestType> 
    <wst:Base> 
    <wsse:UsernameToken xmlns:wsu="http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-94d12e0f-400b-4412-bde8-e03357eb0692"> 
     <wsse:Username>513FDQ37JILL</wsse:Username> 
     <wsse:Password Type="http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"> 
     NXJ3ynAa8Sy136aifThXJl8vLoE= 
     </wsse:Password> 
     <wsse:Nonce>4nJy2oD6xC79zatTHvuywg==</wsse:Nonce> 
     <wsu:Created>2007-02-01T11:03:10Z</wsu:Created> 
    </wsse:UsernameToken> 
    </wst:Base> 
    <wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2002/12/policy"> 
    <wsa:EndpointReference> 
     <wsa:Address>urn:GSO-SystemServices:external:1.65:GatewayWebServices</wsa:Address> 
    </wsa:EndpointReference> 
    </wsp:AppliesTo> Version 1.0 32 9 June 2008 
    <wst:Lifetime> 
    <wsu:Expires>2012-04-13T20:23:11Z</wsu:Expires> 
    </wst:Lifetime> 
</wst:RequestSecurityToken> 
</soap:Body> 
</soap:Envelope> 

Das Hauptproblem ist, ich kann nicht das Sicherheitselement zu zeigen. Ich habe gerade in der app.config-Datei herumgespielt und verschiedene Arten von Bindungen getestet, aber ich bin wirklich neu in der Verwendung von Diensten und bin völlig festgefahren. Hier ist meine aktuelle app.config:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    </configSections> 
    <system.serviceModel> 
    <bindings> 
     <customBinding> 
      <binding name="XmlTokenServiceBinding" > 
       <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16" 
        messageVersion="Soap11WSAddressing10" writeEncoding="utf-8"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
       </textMessageEncoding> 
       <security authenticationMode="SecureConversation" includeTimestamp="True" requireSecurityContextCancellation="false" 
         messageSecurityVersion="WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10"> 
       </security>     
       <httpsTransport manualAddressing="false" maxBufferPoolSize="524288" 
        maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous" 
        bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard" 
        keepAliveEnabled="true" maxBufferSize="65536" proxyAuthenticationScheme="Anonymous" 
        realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false" 
        useDefaultWebProxy="true" requireClientCertificate="false" /> 
      </binding> 
     </customBinding> 
    </bindings> 
    <behaviors> 
    <endpointBehaviors> 
     <behavior> 
     <clientVia viaUri="https://secure.gateway.gov.uk/soap/2007/02/sts/GatewayTokenService.ashx"/> 
     </behavior> 
    </endpointBehaviors> 
    </behaviors> 
    <client> 
     <endpoint address="https://secure.gateway.gov.uk/soap/2007/02/sts/GatewayTokenService.ashx" 
      binding="customBinding" bindingConfiguration="XmlTokenServiceBinding" 
      contract="ServiceReference1.XmlTokenServicePortType" name="XmlTokenServicePort" /> 
    </client> 
</system.serviceModel> 

bearbeiten: Code wie in den Kommentaren zum Aufruf Dienst angefordert:

TokenService.RequestSecurityToken request = CreateTokenRequest(); 
    TokenService.XmlTokenServicePortTypeClient client = new TokenService.XmlTokenServicePortTypeClient(); 
    TokenService.RequestSecurityTokenResponseType response = client.RequestSecurityTokenRequest(request); 

Auch hier wird die Anforderungsnachricht durch Fiedler:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:a="http://www.w3.org/2005/08/addressing"> 
<s:Header> 
    <a:Action s:mustUnderstand="1">http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue</a:Action> 
    <a:MessageID>urn:uuid:0f43afa7-c22c-400b-87b2-c9b76bd0abdd</a:MessageID> 
    <a:ReplyTo> 
     <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> 
    </a:ReplyTo> 
     <a:To s:mustUnderstand="1">https://secure.gateway.gov.uk/soap/2007/02/sts/GatewayTokenService.ashx</a:To> 
</s:Header> 
<s:Body> 
    <t:RequestSecurityToken Context="uuid-829d42ad-a560-44aa-9be8-95c212d82762-1" xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust"> 
     <t:TokenType>http://schemas.xmlsoap.org/ws/2005/02/sc/sct</t:TokenType> 
     <t:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</t:RequestType> 
     <t:KeySize>256</t:KeySize> 
     <t:BinaryExchange ValueType="http://schemas.xmlsoap.org/ws/2005/02/trust/spnego" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">YIGeBgYrBgEFBQKggZMwgZCgGjAYBgorBgEEAYI3AgIeBgorBgEEAYI3AgIKonIEcE5FR09FWFRTAAAAAAAAAABgAAAAcAAAABOP7thI+QdbUguCiBDWyeqYiLGof7AdxPVl4cuUPGbTiMyHDzMox/EGGxas/mzB/AAAAAAAAAAAYAAAAAEAAAAAAAAAAAAAAEVyfDIyRYtIv9kqa6BepAo=</t:BinaryExchange> 
    </t:RequestSecurityToken> 
</s:Body> 
</s:Envelope> 
+0

Bitte zeigen Sie den Code an, mit dem Sie den Dienst anrufen. Sie sollten nicht "den Körperabschnitt erstellen" oder "den Titel richtig erhalten" müssen. WCF sollte das für Sie tun. –

+0

Ihre Frage führte mich zu der Annahme, dass Sie versuchten, XML von Hand zu erstellen. Manipulieren Sie XML oder nicht? –

+0

Nun erwartet der Body-Abschnitt einen UserToken, den ich erstellen und in den Body-Bereich einfügen muss. Was den Header anbelangt, wird der Rest für mich erstellt, nur diesen einen Abschnitt nicht. – emybob

Antwort

0

Haben Sie zusätzliche Spezifikationen für die Konfiguration der Dienstsicherheit? scheint, als würde es nicht nur eine Nachricht, sondern mehrere Nachrichtenaustausch (WS-Trust) erfordern. Auch die Beispielnachricht verwendet die ws-Adressierungsversion 2004/03, die nicht direkt von der wcf unterstützt wird. All dies kann in Ihrem Fall ein Problem sein oder nicht (vielleicht arbeiten Sie einfach direkt mit dem STS)

Um Ihre unmittelbare Frage zu beantworten - Ihre Einstellung sollte einige kine von Sicherheit Header ausgeben. Warum denkst du es nicht? Die WCF-Protokolle zeigen die Sicherheit nicht an (es sei denn, sie wurden für die Protokollierung auf Transportebene konfiguriert). Verwenden Sie Geiger, um zu sehen, was tatsächlich auf dem Draht geht.

+0

Ich habe bereits Fiddler verwendet, um die Anfrage und Antwort zu sehen, die ich weiß, dass derzeit keine Sicherheit Header erstellt wird. – emybob

+0

Ok. Bitte veröffentlichen Sie ein voll funktionsfähiges Soap-Beispiel (nicht nur den Sicherheitsteil) und die vollständige Soap-Nachricht, die Sie senden (via Fiddler). –

+0

Ok ich habe die volle Probe und Nachricht zu meinem ursprünglichen Beitrag hinzugefügt – emybob

Verwandte Themen