Results 1 to 11 of 11

Thread: Soap WS Security UsernameToken Profile 1.1 WS-I Basic Profile 1.1: 400 Bad Request

  1. #1

    Soap WS Security UsernameToken Profile 1.1 WS-I Basic Profile 1.1: 400 Bad Request

    Ik verstuur met Delphi 10.2 xml pensioenaangiften aan verschillende pensioenuitvoerders. Deze berichten worden verpakt in een soap envelop. Dat doe ik tot nog toe door de soap envelop met header en body handmatig aan te maken (zonder een XML engine als (T|I)XMLDocument te gebruiken). De soap envelop verstuur ik met behulp van idHTTP. Dat werkt allemaal prima.

    Nu moet ik voor het eerst een soap envelop produceren met een header gebaseerd op WS Security UsernameToken Profile 1.1. De betreffende pensioenuitvoerder heeft me de volgende voorbeelden van een soap envelop toegestuurd die voldoen aan de eisen.

    De basisstructuur van het bericht moet zijn:
    Code:
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://www.pensioenfederatie.nl/uniformePensioenAangifte/2015/05/WS">
           <soapenv:Header>
                  <wsse:Security soapenv:mustUnderstand="0" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
                          <wsse:UsernameToken>
                                  <wsse:Username>Gebruikersnaam</wsse:Username>
                                  <wsse:Password>}wachtwoord</wsse:Password>
                           </wsse:UsernameToken>
                  </wsse:Security>
           </soapenv:Header>
           <soapenv:Body>
                  <ws:ZendBerichtAlsZIP>
                         <ws:idLcr>idLcr</ws:idLcr>
                         <ws:idBer>idBer</ws:idBer>
                         <ws:berichtZip>BerichtZipData</ws:berichtZip>
                 </ws:ZendBerichtAlsZIP>
           </soapenv:Body>
    </soapenv:Envelope>
    Daarnaast stuurde ze een door hun testomgeving geaccepteerd testbericht:
    Code:
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
      <s:Header>
        <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>2017-10-05T11:27:05.742Z</u:Created>
            <u:Expires>2017-10-05T11:32:05.742Z</u:Expires>
          </u:Timestamp>
          <o:UsernameToken u:Id="uuid-075a8197-9c2c-43c9-a2cf-3fa6515044e7-1">
            <o:Username>XXXXXXXXXXXX</o:Username>
            <o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">XXXXXXXX</o:Password>
          </o:UsernameToken>
        </o:Security>
        <To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">https://localhost:44300/UPAWebService.svc</To>
        <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://www.pensioenfederatie.nl/uniformePensioenAangifte/2015/05/WS/UPAWebService/ZendBerichtAlsZIP</Action>
      </s:Header>
      <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <ZendBerichtAlsZIP xmlns="http://www.pensioenfederatie.nl/uniformePensioenAangifte/2015/05/WS">
          <idLcr>XXXXXXXX</idLcr>
          <idBer>XXXXXXXXXXXXXX</idBer>
          <berichtZIP>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</berichtZIP>
        </ZendBerichtAlsZIP>
      </s:Body>
    </s:Envelope>
    Op basis daarvan ben ik aan de slag gegaan en nu produceert mijn programma het volgende bericht:
    Code:
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
        <soapenv:Header>
            <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
                <wsu:Timestamp wsu:Id="_67">
                    <wsu:Created>2017-10-27T08:58:28Z</wsu:Created>
                    <wsu:Expires>2017-10-27T09:03:28Z</wsu:Expires>
                </wsu:Timestamp>
                <wsse:UsernameToken wsu:Id="DCADF9E6-67C6-4BD3-9777-5B9E4AD97839">
                    <wsse:Username>UserName</wsse:Username>
                    <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">W242TDJLUUpeeTg1dmcoJQ0K</wsse:Password>
                </wsse:UsernameToken>
            </wsse:Security>
            <To soapenv:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">https://localhost:44300/UPAWebService.svc</To>
            <Action soapenv:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://www.pensioenfederatie.nl/uniformePensioenAangifte/2015/05/WS/UPAWebService/ZendBerichtAlsZIP</Action>
        </soapenv:Header>
        <soapenv:Body>
            <ws:ZendBerichtAlsZIP>
                <ws:idLcr>XXXXXXXX</ws:idLcr>
                <ws:idBer>SLAGER-PA-01A-20171027105827</ws:idBer>          
                <ws:berichtZIP>XXXXXXXX</ws:berichtZIP>
            </ws:ZendBerichtAlsZIP>
        </soapenv:Body>
    </soapenv:Envelope>
    Helaas levert dit bij verzending de volgende foutcode op:
    Code:
    Recv 27-10-2017 11:18:31: HTTP/1.1 400 Bad Request<EOL>
    Cache-Control: private,no-cache, no-store, must-revalidate<EOL>
    Server: Microsoft-IIS/8.5<EOL>X-AspNet-Version: 4.0.30319<EOL>
    Strict-Transport-Security: max-age=31536000<EOL>
    X-FRAME-OPTIONS: SAMEORIGIN<EOL>
    X-Content-Type-Options: nosniff<EOL>
    Date: Fri, 27 Oct 2017 09:18:27 GMT<EOL>
    Content-Length: 0<EOL><EOL>
    Als ik de betrokken pensioenuitvoerder om ondersteuning vraag melden ze dat ze zelfs geen inlogpoging zien, zelfs geen foutieve. Verder geven ze aan dat het SOAP bericht als WS Security UsernameToken Profile 1.1, WS-I Basic Profile 1.1 standaard moet worden verstuurd. In .Net moeten de Credentials aan de verbinding gehangen worden zodat deze in het SOAP verkeer worden gebruikt.
    Nu is dit nieuw voor mij, maar als ik mijn bericht vergelijk met het testvoorbeeld bericht zie ik toch grote overeenkomsten (Timestamp, UsernameToken). Evengoed zijn er zaken niet in orde, maar wat dan precies is de vraag?

    Nu zag ik in http://www.codenewsfast.com/cnf/arti...okmark.7398716 een op zich duidelijk voorbeeld hoe je met de WSDL importer een Delphi unit kunt laten samenstellen met de vereiste SOAPHeader. Deze kun je dan in je overige code aanroepen om de juiste SOAPHeader samen te stellen. En met een HTTPRIO1BeforeExecute kun je de soapenveloppe dan weer bekijken alvorens deze daadwerkelijk te verzenden.

    Als ik de WSDL (https://Pensioenaangifte.AGH.nl/acct...ngifteWs/?wsdl) importeer dan krijg ik deze unit:
    Code:
    // ************************************************************************ //
    // The types declared in this file were generated from data read from the
    // WSDL File described below:
    // WSDL     : https://Pensioenaangifte.AGH.nl/acctest/ws/PensioenaangifteWs/?wsdl
    //  >Import : https://pensioenaangifte.agh.nl/acctest/ws/PensioenaangifteWs/UPAWebService.svc?wsdl=wsdl0
    //  >Import : https://pensioenaangifte.agh.nl/acctest/ws/PensioenaangifteWs/UPAWebService.svc?wsdl=wsdl0>0
    //  >Import : https://pensioenaangifte.agh.nl/acctest/ws/PensioenaangifteWs/UPAWebService.svc?xsd=xsd0
    // Encoding : utf-8
    // Version  : 1.0
    // (10-11-2017 08:55:20 - - $Rev: 90173 $)
    // ************************************************************************ //
    
    unit WSDL_UPA;
    
    interface
    
    uses Soap.InvokeRegistry, Soap.SOAPHTTPClient, System.Types, Soap.XSBuiltIns;
    
    const
      IS_OPTN = $0001;
      IS_REF  = $0080;
    
    
    type
    
      // ************************************************************************ //
      // The following types, referred to in the WSDL document are not being represented
      // in this file. They are either aliases[@] of other types represented or were referred
      // to but never[!] declared in the document. The types from the latter category
      // typically map to predefined/known XML or Embarcadero types; however, they could also 
      // indicate incorrect WSDL documents that failed to declare or import a schema type.
      // ************************************************************************ //
      // !:string          - "http://www.w3.org/2001/XMLSchema"[Gbl]
    
      ZendBerichtAlsZIPResponse = class;            { "http://www.pensioenfederatie.nl/uniformePensioenAangifte/2015/05/WS"[GblCplx] }
      OntvangBerichtAlsZIPResponse = class;         { "http://www.pensioenfederatie.nl/uniformePensioenAangifte/2015/05/WS"[GblCplx] }
    
    
    
      // ************************************************************************ //
      // XML       : ZendBerichtAlsZIPResponse, global, <complexType>
      // Namespace : http://www.pensioenfederatie.nl/uniformePensioenAangifte/2015/05/WS
      // ************************************************************************ //
      ZendBerichtAlsZIPResponse = class(TRemotable)
      private
        FStatus: string;
        FStatus_Specified: boolean;
        FFoutmelding: string;
        FFoutmelding_Specified: boolean;
        procedure SetStatus(Index: Integer; const Astring: string);
        function  Status_Specified(Index: Integer): boolean;
        procedure SetFoutmelding(Index: Integer; const Astring: string);
        function  Foutmelding_Specified(Index: Integer): boolean;
      published
        property Status:      string  Index (IS_OPTN) read FStatus write SetStatus stored Status_Specified;
        property Foutmelding: string  Index (IS_OPTN) read FFoutmelding write SetFoutmelding stored Foutmelding_Specified;
      end;
    
    
    
      // ************************************************************************ //
      // XML       : OntvangBerichtAlsZIPResponse, global, <complexType>
      // Namespace : http://www.pensioenfederatie.nl/uniformePensioenAangifte/2015/05/WS
      // ************************************************************************ //
      OntvangBerichtAlsZIPResponse = class(TRemotable)
      private
        FOntvangBerichtAlsZIPResult: string;
        FOntvangBerichtAlsZIPResult_Specified: boolean;
        procedure SetOntvangBerichtAlsZIPResult(Index: Integer; const Astring: string);
        function  OntvangBerichtAlsZIPResult_Specified(Index: Integer): boolean;
      published
        property OntvangBerichtAlsZIPResult: string  Index (IS_OPTN) read FOntvangBerichtAlsZIPResult write SetOntvangBerichtAlsZIPResult stored OntvangBerichtAlsZIPResult_Specified;
      end;
    
    
      // ************************************************************************ //
      // Namespace : http://www.pensioenfederatie.nl/uniformePensioenAangifte/2015/05/WS
      // soapAction: http://www.pensioenfederatie.nl/uniformePensioenAangifte/2015/05/WS/UPAWebService/%operationName%
      // transport : http://schemas.xmlsoap.org/soap/http
      // style     : document
      // use       : literal
      // binding   : BasicHttpBinding_UPAWebService
      // service   : UPA
      // port      : BasicHttpBinding_UPAWebService
      // URL       : https://pensioenaangifte.agh.nl/acctest/ws/PensioenaangifteWs/UPAWebService.svc
      // ************************************************************************ //
      UPAWebService = interface(IInvokable)
      ['{8898E84C-AFA7-1928-4B19-AB1D27995D31}']
        function  ZendBerichtAlsZIP(const idLcr: string; const idBer: string; const berichtZIP: string): ZendBerichtAlsZIPResponse; stdcall;
        function  OntvangBerichtAlsZIP(const idLcr: string; const idber: string): OntvangBerichtAlsZIPResponse; stdcall;
      end;
    
    function GetUPAWebService(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): UPAWebService;
    
    
    implementation
      uses System.SysUtils;
    
    function GetUPAWebService(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): UPAWebService;
    const
      defWSDL = 'https://Pensioenaangifte.AGH.nl/acctest/ws/PensioenaangifteWs/?wsdl';
      defURL  = 'https://pensioenaangifte.agh.nl/acctest/ws/PensioenaangifteWs/UPAWebService.svc';
      defSvc  = 'UPA';
      defPrt  = 'BasicHttpBinding_UPAWebService';
    var
      RIO: THTTPRIO;
    begin
      Result := nil;
      if (Addr = '') then
      begin
        if UseWSDL then
          Addr := defWSDL
        else
          Addr := defURL;
      end;
      if HTTPRIO = nil then
        RIO := THTTPRIO.Create(nil)
      else
        RIO := HTTPRIO;
      try
        Result := (RIO as UPAWebService);
        if UseWSDL then
        begin
          RIO.WSDLLocation := Addr;
          RIO.Service := defSvc;
          RIO.Port := defPrt;
        end else
          RIO.URL := Addr;
      finally
        if (Result = nil) and (HTTPRIO = nil) then
          RIO.Free;
      end;
    end;
    
    
    procedure ZendBerichtAlsZIPResponse.SetStatus(Index: Integer; const Astring: string);
    begin
      FStatus := Astring;
      FStatus_Specified := True;
    end;
    
    function ZendBerichtAlsZIPResponse.Status_Specified(Index: Integer): boolean;
    begin
      Result := FStatus_Specified;
    end;
    
    procedure ZendBerichtAlsZIPResponse.SetFoutmelding(Index: Integer; const Astring: string);
    begin
      FFoutmelding := Astring;
      FFoutmelding_Specified := True;
    end;
    
    function ZendBerichtAlsZIPResponse.Foutmelding_Specified(Index: Integer): boolean;
    begin
      Result := FFoutmelding_Specified;
    end;
    
    procedure OntvangBerichtAlsZIPResponse.SetOntvangBerichtAlsZIPResult(Index: Integer; const Astring: string);
    begin
      FOntvangBerichtAlsZIPResult := Astring;
      FOntvangBerichtAlsZIPResult_Specified := True;
    end;
    
    function OntvangBerichtAlsZIPResponse.OntvangBerichtAlsZIPResult_Specified(Index: Integer): boolean;
    begin
      Result := FOntvangBerichtAlsZIPResult_Specified;
    end;
    
    initialization
      { UPAWebService }
      InvRegistry.RegisterInterface(TypeInfo(UPAWebService), 'http://www.pensioenfederatie.nl/uniformePensioenAangifte/2015/05/WS', 'utf-8');
      InvRegistry.RegisterDefaultSOAPAction(TypeInfo(UPAWebService), 'http://www.pensioenfederatie.nl/uniformePensioenAangifte/2015/05/WS/UPAWebService/%operationName%');
      InvRegistry.RegisterInvokeOptions(TypeInfo(UPAWebService), ioDocument);
      { UPAWebService.ZendBerichtAlsZIP }
      InvRegistry.RegisterMethodInfo(TypeInfo(UPAWebService), 'ZendBerichtAlsZIP', '',
                                     '[ReturnName="ZendBerichtAlsZIPResult"]', IS_OPTN);
      { UPAWebService.OntvangBerichtAlsZIP }
      InvRegistry.RegisterMethodInfo(TypeInfo(UPAWebService), 'OntvangBerichtAlsZIP', '',
                                     '[ReturnName="OntvangBerichtAlsZIPResult"]', IS_OPTN);
      RemClassRegistry.RegisterXSClass(ZendBerichtAlsZIPResponse, 'http://www.pensioenfederatie.nl/uniformePensioenAangifte/2015/05/WS', 'ZendBerichtAlsZIPResponse');
      RemClassRegistry.RegisterXSClass(OntvangBerichtAlsZIPResponse, 'http://www.pensioenfederatie.nl/uniformePensioenAangifte/2015/05/WS', 'OntvangBerichtAlsZIPResponse');
    
    end.
    Daarin zie ik helemaal niets staan over een Header, laat staan over Timestamp, UsernameToken, Password of UserName. Kortom, hoe moet ik verder?

  2. #2
    Voor de volledigheid nog even de complete inhoud van het IdLogfile na verzending:
    Code:
    Stat Connected.
    Sent 27-10-2017 11:18:31: POST /acctest/ws/PensioenaangifteWs/UPAWebService.svc HTTP/1.1<EOL>
    Content-Type: text/xml; charset=utf-8<EOL>
    Content-Length: 3503<EOL>SOAPAction: ""<EOL>
    Host: Pensioenaangifte.agh.nl<EOL>
    Accept: text/html, */*<EOL>
    Accept-Encoding: gzip, deflate, identity<EOL>
    User-Agent: Mozilla/3.0 (compatible; Indy Library)<EOL>
    Authorization: Basic QTk1OTcyNjQzOlcyNDJUREpMVVVwZWVUZzFkbWNvSlEwSw==<EOL>
    Proxy-Authorization: Basic Og==<EOL><EOL>
    
    Sent 27-10-2017 11:18:31: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><EOL>    
    <soapenv:Header><EOL>        
           <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><EOL>
                <wsu:Timestamp wsu:Id="_33"><EOL>                
                      <wsu:Created>2017-10-27T09:18:24Z</wsu:Created><EOL>                
                      <wsu:Expires>2017-10-27T09:23:24Z</wsu:Expires><EOL>            
                </wsu:Timestamp><EOL>            
                <wsse:UsernameToken wsu:Id="43C9E262-83A4-4E01-B499-0A03A9E1B142"><EOL>
                    <wsse:Username>A95972643</wsse:Username><EOL>
                    <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">W242TDJLUUpeeTg1dmcoJQ0K</wsse:Password><EOL>
                </wsse:UsernameToken><EOL>
            </wsse:Security><EOL>
            <To soapenv:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">https://localhost:44300/UPAWebService.svc</To><EOL>
            <Action soapenv:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://www.pensioenfederatie.nl/uniformePensioenAangifte/2015/05/WS/UPAWebService/ZendBerichtAlsZIP</Action><EOL>
        </soapenv:Header><EOL>
        <soapenv:Body><EOL>
            <ws:ZendBerichtAlsZIP><EOL>
                <ws:idLcr>A95972643</ws:idLcr><EOL>
                <ws:idBer>SLAGER-PA-01A-20171027111824</ws:idBer><EOL>            <ws:berichtZIP>UEsDBBQAAgAIAE1aW0saYKlU0QQAAMwYAAA1AAAAVVBBXzgzMjk1MTc5MUw3N19TTEFHRVItUEEtMDFBXzIwMTcxMDI3MTExODI0X1VQQS54bWztWV2P2jgUfV9p/wPinSQOHwmjTKpAEUVLARGGkfYtQzzgJnGQE6A/f68TBwKdmLRSuzurjtBgn5zjj3uv7etgffgahY0jZgmJ6WMTKVqzgekm9gndPjYn7rxlmt1+CzU/2H/+YS0wBR6mjke35DXFDRDT5LG5S9P9g6qeTidlLyiv2MfMSwlWaKgeKHmNWYRv9aquIUPVULPRWJeHAH014M8aYEY2u1RUM2jiA2i7U2c8WrYWTktDTou3gjTdQAiZesdSc05J9NFLVz50Gtmc2kJaSzdWCD0g84HzL49LmmFM0wUMyv60VBpjZaDAFxo13NFyPRmOhvPZyhmuLPVMK0lXOJwxG+ntTrdnmH3NUnOkRFlmQHKKNU3rmZa6vCWM8QtzTwsvCHBqOxsWJwkC3hV8ZZbphtlOv9s39F6nzW3AgRJjFnHAJdE+xA03fk1PHsOWmsPC3uq1wS3HjwglSZo58ohHmO4w8cutTncwbLOt97vI6KOpYVhqBl11PFm81S+gZZsdg6Fvf559BGNlxfIz8sU/ekERNaVHhXfh0XF15N41ISLgkzlVoN/SR4T6JXo7pwv0hr6OwxD7ZIsruhfBAqRNZiQJLZ9MnHpeuMRbHMIaw7SCd4kSaDAJbV3ESF6TarZ/0YgF9pOGenoLoa7BpQKUCGFgQJtSMIvGQ7aoyiVjloQLhiOC7b7WUzp6piyhcnlOgo5sZHYU0e8FlIvBFinsG+FTpu91lJ6R6a9weROT4JiJM52oVDhOrem5X+/hfv8XeZjrCif9gIs7JflvH3/nKjbfh4/1/4GH+aleZz+3JjSIoyTFFBKoXXzgSdOEEpDhKudas0M0WfOR5oUKlji88nTl+kCrbNhLDwcWki8BT0fiWOpyOIcJT1HA1xr8g7AUiESzjmMW2n9bal6QtU62dBbZz/PZx9Fy5jifofkckoggs/G91EZ9UytmLCCJaMYVYEs5a4zzpZd9S3iOz3AyIJRiGnrUl1DzaaZMzNFdLR0HkkGO3BF9OpCEW95SRekOf7HJEklnYKlQvEN+BrfvQzGoxRTG5FqqACXzVutNPLNzrRi7LIw9JJSxL90+SrFu1ov13Pos5QupC1bPShLqEJJ75nObi5KUO8D7lW8PODkvytjO3NaMDuzNvCQLLdjMnmZwB3oO7LaZbZFl6J5ySFN2oxRQlatqesByYZuL2ZIkZBNvWYz3P8FVIrd+K9+WehiGljuYF2SHJUnGbM/9K0pVRqk7WesZs4DiCIJ8CwfFEa6tsv6n9GnADmkMK1Xh4z3XpZrpy2IH253eU/jZLupShbsu8921nL3yXgYDOz+Oi5pse/eCAWyPOV9UJPT5fruEm6Igol6uu0Yl8tHXlLle0V1Ru9/fte4GlJpjQsehf8luCkCqmZ8g2Sr4WeXOQs3yFbBGN1+keVWiWbD4KDrIijIDULY6+0dUquK8dvhaRR40rhHmYqWDZJwlet/sAeLJf+VCW86D7ybBebbKE97t+SJbxu5KIa8832EvyF3Zc0Bto13qjgN1ooy/Szuny9doVVjUdPa7DIq6d+AfDorzzvHdUdG5VtYOi7Lod1T81FvzvxAV+juPiVKKeff2y++M1W9R4U7+5gtefi+peP8MJrj5KQHAfwBQSwECFAAUAAIACABNWltLGmCpVNEEAADMGAAANQAAAAAAAAABAAAAAAAAAAAAVVBBXzgzMjk1MTc5MUw3N19TTEFHRVItUEEtMDFBXzIwMTcxMDI3MTExODI0X1VQQS54bWxQSwUGAAAAAAEAAQBjAAAAJAUAAAAA</ws:berichtZIP><EOL>        </ws:ZendBerichtAlsZIP><EOL>
        </soapenv:Body><EOL>
    </soapenv:Envelope><EOL>
    
    Recv 27-10-2017 11:18:31: HTTP/1.1 400 Bad Request<EOL>
    Cache-Control: private,no-cache, no-store, must-revalidate<EOL>
    Server: Microsoft-IIS/8.5<EOL>
    X-AspNet-Version: 4.0.30319<EOL>
    Strict-Transport-Security: max-age=31536000<EOL>
    X-FRAME-OPTIONS: SAMEORIGIN<EOL>
    X-Content-Type-Options: nosniff<EOL>
    Date: Fri, 27 Oct 2017 09:18:27 GMT<EOL>
    Content-Length: 0<EOL><EOL>

  3. #3
    Je bedoeld dat als je hun testbericht via dezelfde methode verzend wordt deze wel geaccepteerd?

  4. #4
    Nee, dat lukt niet. Ik heb het wel geprobeerd, maar dan kreeg ik als retourbericht:

    Code:
    Recv 6-10-2017 10:59:53: HTTP/1.1 400 Bad Request<EOL>
    Cache-Control: private,no-cache, no-store, must-revalidate<EOL>
    Server: Microsoft-IIS/8.5<EOL>X-AspNet-Version: 4.0.30319<EOL>
    Strict-Transport-Security: max-age=31536000<EOL>
    X-FRAME-OPTIONS: SAMEORIGIN<EOL>
    X-Content-Type-Options: nosniff<EOL>
    Date: Fri, 06 Oct 2017 08:59:47 GMT<EOL>
    Content-Length: 0<EOL><EOL>
    En daarop van hun helpdesk de mededeling: Volgens mij kun je helemaal niet letterlijk het SOAP bericht zo overnemen omdat je zelf het Created, Expired timestamp moet zetten en ook een token moet genereren volgens de specs.

  5. #5
    Je kunt toch datzelfde bericht sturen maar dan wel de juiste Authorization: Basic-code en UsernameToken gebruiken.

    Weet je hoe je die moet genereren?

    Wordt er gebruik gemaakt van HTTPS?
    (heb je daar de juiste openssl dll's voor gebruikt?)

    Als er iets mis is met de xml dan lijkt mij dat je daar een andere foutmelding dan 500 voor krijgt.

    (maar aan de andere kant... elke klein foutje zou al een 500 kunnen geven)

  6. #6
    Ik verstuur het bericht met de volgende code (waaronder BasicAuthentication):
    Code:
    procedure Send_HTTP;
    var
      XMLFileStream : TFileStream;
    begin  {procedure Send_HTTP}
      XMLFileStream := TFileStream.Create(XmlSendDlg.XmlFileIn, fmOpenRead Or fmShareDenyWrite);
      Try
        IdHTTP1.HandleRedirects := True;
        IdHTTP1.HTTPOptions := [hoInProcessAuth, hoKeepOrigProtocol, hoForceEncodeParams];
        IdHTTP1.IoHandler.Port := Port_HTTPS;
        IdHTTP1.Request.ContentType := 'text/xml';
        IdHTTP1.Request.CharSet := 'utf-8';
        IdHTTP1.Request.Username := MeUsername.Text;
        IdHTTP1.Request.Password := MePassword.Text;
        IdHTTP1.Request.BasicAuthentication := True;
        IdHTTP1.ReadTimeout := ReadTimeoutConst;
        IdHTTP1.Request.CustomHeaders.Clear;
        IdHTTP1.Request.CustomHeaders.Add('SOAPAction: "' + MeSoapAction.Text + '"');
        Try
          ReturnStr := IdHTTP1.Post(MeWebSite.Text, XMLFileStream);
        Except
          On E: Exception Do
          begin
            Memo1.Lines.Add('Fout: ' + E.Message);
          end;
        end;
        IdHTTP1.Disconnect;
      Finally
        XMLFileStream.Free;
      end;
    end; {proc Send_HTTP}
    Hoe ik UsernameToken en ook TimeStamp wezenlijk moet genereren volgens de specifieke eisen van deze pensioenuitvoerder: geen idee. Ik heb de structuur van het voorbeeld overgenomen. De Id's genereer ik voor TimeStamp Id met Random(100) en voor UsernameToken Id met GuidToString. Het password vertaal ik rechtstreeks in 64Base. Niet omdat ik informatie heb dat het zo moet, maar omdat ik al knutselend een uitkomst probeer te realiseren die zo op het oog in de buurt komt van het voorbeeld. In de hoop dat ik uit de returnmessage dan zou kunnen opmaken wat ik nog moet verbeteren. Deze 'trial and error' methode gebruik ik bij gebrek aan beter.

    De berichten die ik wèl succesvol kan versturen aan andere pensioenuitvoerders (met headers zonder WS Security UsernameToken Profile 1.1) gaan naar adressen die allemaal met https:// beginnen. Dus ik neem aan dat er gebruik gemaakt wordt van HTTPS. Daarbij gebruik ik OpenSSL (libeay32.dll en ssleay32.dll) v1.0.2L van 2017-05-29 in combinatie met Indy 10.6.2.5366.

  7. #7
    Quote Originally Posted by Walt Duzz View Post
    Hoe ik UsernameToken en ook TimeStamp wezenlijk moet genereren volgens de specifieke eisen van deze pensioenuitvoerder: geen idee.
    Ik zie in hun voorbeeld helemaal geen Timestamp terugkomen. Dus waarom zou je die gebruiken.

    Vandaar dat ik voorstelde om hun enveloppe te gebruiken en alleen het gebruikersnaam en wachtwoord te wijzigen en te kijken wat je dan terug krijgt.

    Waarom zou je overigens het wachtwoord coderen naar Base64? Is dat nodig?
    Ik zou het eens zonder proberen in de Authorization basic en in de enveloppe.

    (Is dat overigens een correct base64 password wat je daar gebruikte ??? Want als ik die decodeer en weer codeer kom ik op iets anders uit )

  8. #8
    De pensioenuitvoerder stuurde mij eerst een basisstructuur en later nog een geaccepteerd testbericht. In een begeleidende e-mail gaven ze aan dat het eerste (de basisstructuur) enigszins uit de losse pols was opgesteld. Het geaccepteerd testbericht (met Timestamp inclusief Id en UsernameToken met Id) zou dus het juiste zijn.

    Maar ook als ik het bericht opmaak volgens de basisstructuur en het wachtwoord niet codeer (het omzetten naar een 64base password was niet meer dan een poging te kijken of het daaraan schort) dan krijg ik in het IdLogfile dezelfde foutmelding (de originele inloggegevens heb ik hieronder gewijzigd in Username en Password):
    Code:
    Stat Connected.
    Sent 13-11-2017 14:03:49: POST /acctest/ws/PensioenaangifteWs/UPAWebService.svc HTTP/1.1<EOL>
                                              Content-Type: text/xml; charset=utf-8<EOL>
                                              Content-Length: 2746<EOL>
                                              SOAPAction: "http://www.pensioenfederatie.nl/uniformePensioenAangifte/2015/05/WS/UPAWebService/ZendBerichtAlsZIP"<EOL>
                                              Host: Pensioenaangifte.agh.nl<EOL>
                                              Accept: text/html, */*<EOL>
                                              Accept-Encoding: gzip, deflate, identity<EOL>
                                              User-Agent: Mozilla/3.0 (compatible; Indy Library)<EOL>
                                              Authorization: Basic QTk1OTcyNjQzOltuNkwyS1FKXnk4NXZnKCU=<EOL>
                                              Proxy-Authorization: Basic Og==<EOL>
    
    Sent 13-11-2017 14:03:49: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
                                                  <soapenv:Header>
                                                      <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
                                                          <wsse:UsernameToken>
                                                              <wsse:Username>Username</wsse:Username>
                                                              <wsse:Password>Password</wsse:Password>
                                                          </wsse:UsernameToken>
                                                      </wsse:Security>
                                                  </soapenv:Header>
                                                  <soapenv:Body>
                                                      <ws:ZendBerichtAlsZIP>
                                                          <ws:idLcr>A95972643</ws:idLcr>
                                                          <ws:idBer>CLIENT-PA-01A-20171113140339</ws:idBer>
                                                          <ws:berichtZIP>XXXXXX</ws:berichtZIP>
                                                      </ws:ZendBerichtAlsZIP>
                                                  </soapenv:Body>
                                              </soapenv:Envelope>
    
    Recv 13-11-2017 14:03:49: HTTP/1.1 400 Bad Request<EOL>
                                              Cache-Control: private,no-cache, no-store, must-revalidate<EOL>
                                              Server: Microsoft-IIS/8.5<EOL>
                                              X-AspNet-Version: 4.0.30319<EOL>
                                              Strict-Transport-Security: max-age=31536000<EOL>
                                              X-FRAME-OPTIONS: SAMEORIGIN<EOL>
                                              X-Content-Type-Options: nosniff<EOL>
                                              Date: Mon, 13 Nov 2017 13:03:42 GMT<EOL>
                                              Content-Length: 0<EOL>
    Overigens heb ik zowel getest met BasicAuthentication op zowel True als False. Beiden met hetzelfde resultaat.

    Waar ik eigenlijk naar op zoek ben is: waar vind ik de informatie die aangeeft hoe ik de soap header aanmaak o.b.v. WS Security UsernameToken Profile 1.1 WS-I Basic Profile 1.1

  9. #9
    Ik krijg een HTTP/1.1 500 Internal Server Error.

    Maar ik gebruik dan ook xmlns:ws="http://www.pensioenfederatie.nl/uniformePensioenAangifte/2015/05/WS" bovenin.

    XML Code:
    1. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://www.pensioenfederatie.nl/uniformePensioenAangifte/2015/05/WS">
    2.     <soapenv:Header>
    3.         <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    4.             <wsse:UsernameToken>
    5.                 <wsse:Username>xx</wsse:Username>
    6.                 <wsse:Password>xx (met en zonder == op einde ipv 0K)</wsse:Password>
    7.             </wsse:UsernameToken>
    8.         </wsse:Security>
    9.     </soapenv:Header>
    10.     <soapenv:Body>
    11.         <ws:ZendBerichtAlsZIP>
    12.             <ws:idLcr>xx (zelfde als username)</ws:idLcr>
    13.             <ws:idBer>CLIENT-PA-01A-20171113140339</ws:idBer>
    14.             <ws:berichtZip>base64-zip</ws:berichtZip>
    15.         </ws:ZendBerichtAlsZIP>
    16.     </soapenv:Body>
    17. </soapenv:Envelope>

    Indien ik xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" gebruik bovenin krijg ik ook een Bad Request.

    Overigens is http://www.pensioenfederatie.nl/unif...fte/2015/05/WS een ongeldige pagina.
    Maar ze noemde hem wel in dat testbericht.

  10. #10
    RVK, twee goede opmerkingen achter elkaar. Als ik het bericht opmaak
    - volgens de basisstructuur zonder Timestamp en zonder id's
    - met xmlns:ws="http://www.pensioenfederatie.nl/uniformePensioenAangifte/2015/05/WS" bovenin.
    dan wordt dit:

    Code:
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"  xmlns:ws="http://www.pensioenfederatie.nl/uniformePensioenAangifte/2015/05/WS">
        <soapenv:Header>
            <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
                <wsse:UsernameToken>
                    <wsse:Username>Username</wsse:Username>
                    <wsse:Password>Password</wsse:Password>
                </wsse:UsernameToken>
            </wsse:Security>
        </soapenv:Header>
        <soapenv:Body>
            <ws:ZendBerichtAlsZIP>
                <ws:idLcr>A95972643</ws:idLcr>
                <ws:idBer>CLIENT-PA-01A-20171113155149</ws:idBer>
                <ws:berichtZIP>XXXXX</ws:berichtZIP>
            </ws:ZendBerichtAlsZIP>
        </soapenv:Body>
    </soapenv:Envelope>
    En als ik dat verstuur met de echte username en password (plain text) dan krijg ik Response: HTTP/1.1 200 OK.
    Bedankt voor het meedenken.

  11. #11
    Met goede username en password (plain text) had ik ook geprobeerd (precies zoals jij hem nu hebt) maar toch kreeg ik een HTTP/1.1 500 Internal Server Error.

    Maar goed... fijn dat het werkt nu

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •