Laden...

Erweiterung eines SOAP Headers um einen Tag UsernameToken

Erstellt von ronny75 vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.725 Views
R
ronny75 Themenstarter:in
69 Beiträge seit 2009
vor 5 Jahren
Erweiterung eines SOAP Headers um einen Tag UsernameToken

Hallo zusammen,

irgendwie gehen mir die Ideen aus..:(

mit dem Code:


            try
            {
                currentClient = new PartnerVerwaltungServiceClient();
                currentClient.Endpoint.Address = new System.ServiceModel.EndpointAddress(url);

                currentClient.ClientCredentials.UserName.Password = Passwort;
                currentClient.ClientCredentials.UserName.UserName = Username;

                // Testaufruf für die Prüfung ob Verbindung mit ClientCredentials hergestellt werden kann.
                currentClient.Open();


                using (var scope = new OperationContextScope(currentClient.InnerChannel))
                {
                    // Create a custom soap header
                    var msgHeader1 = MessageHeader.CreateHeader("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "");
                    var msgHeader2 = MessageHeader.CreateHeader("UsernameToken", "", "");
                    var msgHeader3 = MessageHeader.CreateHeader("Username", "", "047686");
                    // Add the header into request message
                    OperationContext.Current.OutgoingMessageHeaders.Add(msgHeader1);
                    OperationContext.Current.OutgoingMessageHeaders.Add(msgHeader2);
                    OperationContext.Current.OutgoingMessageHeaders.Add(msgHeader3);

                    var res = currentClient.firmenkundeLesen(null);
                }

Versuche ich folgende Header Infos hinzu bekommen...


<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken>
<wsse:Username>die Personalnummer</wsse:Username>
</wsse:UsernameToken>
</wsse:Security>
</s:Header>
            <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                        <firmenkundeLesen xmlns="http://partnerverwaltungservice.ws.hdi.de/service"/>
            </s:Body>
</s:Envelope>

Leider klappt es nicht.

Weiß jemand wie man da ran gehen könnte?

VG

Ron

16.807 Beiträge seit 2008
vor 5 Jahren

Normalerweise musst Du nur

       currentClient.ClientCredentials.UserName.Password = Passwort;
                currentClient.ClientCredentials.UserName.UserName = Username;

verwenden, was Du tust sowie im Binding

binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;

den Type setzen, was man in Deinem Snippet nicht sieht.

Custom Header kann an der Stelle nicht funktionieren, wenn Du nicht im korrekten Namespace bist.

R
ronny75 Themenstarter:in
69 Beiträge seit 2009
vor 5 Jahren

Hallo Abt,

Vielen Dank für den Hinweis.

Leider bekomme ich die Meldung:

{"Die HTTP-Anforderung ist beim Clientauthentifizierungsschema \"Anonymous\" nicht autorisiert. Vom Server wurde der Authentifizierungsheader \"Basic realm=\"Default Realm\"\" empfangen

Ich hatte den Code nach deinem Hinweis folgendermaßen erweitert:


  System.ServiceModel.BasicHttpBinding b = new BasicHttpBinding();
                b.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
                currentClient = new PartnerVerwaltungServiceClient(b, new EndpointAddress(url));
                currentClient.ClientCredentials.UserName.Password = Passwort;
                currentClient.ClientCredentials.UserName.UserName = Username;
                // Testaufruf für die Prüfung ob Verbindung mit ClientCredentials hergestellt werden kann.
                currentClient.Open();
                currentClient.firmenkundeLesen(null);

Was mache ich nur falsch?

VG

Ron

3.003 Beiträge seit 2006
vor 5 Jahren

Was der service da antwortet, ist die challenge für basic authentication. Aus seiner Sicht ist also soweit alles in Ordnung und er erwartet in der Antwort des clients dann die Credentials, die du eingetragen hast.

Nimm mal ein Netzwerk-Traffic-Mitschneide-Tool deiner Wahl (wireshark, fiddler) und guck dir damit an, was dein Client so übers Netz versendet.

(Sollte so aussehen: https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication)

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)