1

I'm trying to call a WCF service from a WSDL given to me by the 3rd party which I'm trying to integrate with, they gave me a sample request that my code should generate, it contains wsse:Security element and it has two digest and a signature see below (I have removed the namespaces from the soapenv:Envelope):

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:ns3="" xmlns:ns2="" xmlns:ns1="" xmlns:ns="" xmlns:soapenv="">
    <soapenv:Header>
        <ns:MessageHeader>
            <ns:ServiceInitiatorKey>801</ns:ServiceInitiatorKey>
            <ns:ServiceProviderKey>001</ns:ServiceProviderKey>
            <ns:ServiceConsumerId>801</ns:ServiceConsumerId>
            <ns:RqUID>22xzo5bi-8e98-8bnn-32ge-xz3a6eiss241</ns:RqUID>
            <ns:Date>2021-11-09T17:17:10</ns:Date>
            <ns:Lang>en-gb</ns:Lang>
        </ns:MessageHeader>
        <wsse:Security xmlns:wsse="" soapenv:mustUnderstand="1">
            <wsu:Timestamp wsu:Id="Timestamp-244f9b6d-a6a6-4909-8143-ba1aefb6e8dd" xmlns:wsu="">
                <wsu:Created>2022-04-05T13:46:19Z</wsu:Created>
                <wsu:Expires>2022-04-05T13:51:19Z</wsu:Expires>
            </wsu:Timestamp>
            <wsse:BinarySecurityToken wsu:Id="SecurityToken-493e1d98-bc0a-4e80-b5ca-ba1aefb6d910" EncodingType="" ValueType="" xmlns:wsu="">base64 certificate</wsse:BinarySecurityToken>
            <Signature xmlns="">
                <SignedInfo>
                    <CanonicalizationMethod Algorithm=""/>
                    <SignatureMethod Algorithm=""/>
                    <Reference URI="#Timestamp-244f9b6d-a6a6-4909-8143-ba1aefb6e8dd">
                        <Transforms>
                            <Transform Algorithm=""/>
                        </Transforms>
                        <DigestMethod Algorithm=""/>
                        <DigestValue>S8Hlmk9nw1a0s5l+Q98ZH+kJycQ=</DigestValue>
                    </Reference>
                    <Reference URI="#Body-95ba4897-1060-42c4-ac8d-ba1aefb68631">
                        <Transforms>
                            <Transform Algorithm=""/>
                        </Transforms>
                        <DigestMethod Algorithm=""/>
                        <DigestValue>5VIb9TVR12MpmcXakp5gGJTTZYc=</DigestValue>
                    </Reference>
                </SignedInfo>
                <SignatureValue>UVvKd3snupusij/MDYbykmlWe+/tm+gQIvJ9aCav2nwpvKM4AwPrxmjcp3Nvo6s8UDeBsxlk/6E1FtCt1FWhJEwUewIpmCsK1Urp2xf0W74FMDfz4ABB7xpr6S/loGwznOlFPz59Ih1gP+AYVo8D0WnaFvjycm4DH97YmcDs2j4R3YyYJA/IjiJ2QPS4O+f7Ne+/cAbz19FQRUfQVTLu7KQrQAs7adjj4vvJuVgbqKZo45fIL1/HSYt+bXXOYe+PfOCPs6UBy0SUlZy/OEucz7BwldhN921ReuQmhPdPKUtDZ8MGr4T72pep260Pu7hmDtUspxTLzt3J8OUyMGtcxQ==</SignatureValue>
                <KeyInfo>
                    <wsse:SecurityTokenReference xmlns="">
                        <wsse:Reference URI="#SecurityToken-493e1d98-bc0a-4e80-b5ca-ba1aefb6d910" ValueType=""/>
                    </wsse:SecurityTokenReference>
                </KeyInfo>
            </Signature>
        </wsse:Security>
    </soapenv:Header>
    <soapenv:Body wsu:Id="Body-95ba4897-1060-42c4-ac8d-ba1aefb68631" xmlns:wsu="">
        <ns1:LoadRq>
            <ns1:Timestamp>2021-11-09T17:17:10</ns1:Timestamp>
            <ns1:Payment>
                <ns1:BillerId>10002</ns1:BillerId>
                <ns1:CurAmt>200</ns1:CurAmt>
                <ns1:PrcDt>2021-11-09T17:17:10</ns1:PrcDt>
                <ns1:DueDt>2022-12-09T17:17:10</ns1:DueDt>
                <ns1:BillerPmtId>1000256897</ns1:BillerPmtId>
                <ns1:PaymentRef>
                    <ns3:BillNumberWithAccount>
                        <ns3:BillingAcct>10002261195</ns3:BillingAcct>
                        <ns3:BillNumber>10002261195</ns3:BillNumber>
                    </ns3:BillNumberWithAccount>         
                </ns1:PaymentRef>
            </ns1:Payment>
        </ns1:LoadRq>
    </soapenv:Body>
</soapenv:Envelope>

I'm using a client form the WSDL they provided and my code generates an XML envelope as below (it's a different service from the one above but it should have the same security headers, also I have removed the namespaces of some elements):

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="">
    <s:Header>
        <Action s:mustUnderstand="1" xmlns=""></Action>
        <h:MessageHeader xmlns="" xmlns:xsi="" xmlns:xsd="" xmlns:h="">
            <ServiceInitiatorKey>908</ServiceInitiatorKey>
            <ServiceProviderKey>001</ServiceProviderKey>
            <ServiceConsumerId>908</ServiceConsumerId>
            <RqUID>de9f7eea-c84f-4b92-8541-fceaab54260c</RqUID>
            <Date>2024-12-12T14:54:28</Date>
            <Lang>en-gb</Lang>
        </h:MessageHeader>
    </s:Header>
    <s:Body xmlns:xsi="" xmlns:xsd="">
        <CreateRq xmlns="">
            <Partner>
                <PartnerInfo xmlns="">
                    <PartnerType>SUB-BILLER</PartnerType>
                    <OwnerId>908</OwnerId>
                </PartnerInfo>
            </Partner>
        </CreateRq>
    </s:Body>
</s:Envelope>

how can I add the needed security headers and how do I calculate them and what do they even mean? the client has a function that accept two objects, the MessageHeader and the Partner and I'm using _client.CreateAsync(MessageHeader, Partner);

can someone please help me? I have been looking for a solution for more than a week now and I can't seem to understand it, I'm using .net core 8

Many thanks.

I have tried to add a messageInspector and modify the XML beforeSend but with no luck, and other threads here seem to add username and password and that's not what i'm trying to achieve.

New contributor
Mohammad Al-Daqqah is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.
1
  • You can start by trying to configure diagnostic traces or even to view them using transport-level logging so that you can get specific error information.
    – Jiayao
    Commented 5 hours ago

0

Browse other questions tagged or ask your own question.