2010-01-26 9 views
7

Ich habe erfolgreich einen WS-Client erstellt, der korrekt funktioniert, wenn Sie keine Authentifizierung verwenden.SOAP hinzufügen: HEADER Benutzername und Passwort mit WSE 3.0

Allerdings muss der Server (WebSphere) jetzt ein Ws-Security-Benutzernamen-Token hinzufügen, und es fällt mir schwer, dies zu tun. Die sich ergebende SOAP-Nachricht soll so etwas wie folgt aussehen:

<soapenv:Envelope 
    xmlns:ns="http://foo.bar/1.0" 
    xmlns:ns1="http://www.witsml.org/schemas/140" 
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 

    <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 wsu:Id="UsernameToken-2" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
     <wsse:Username>foo</wsse:Username> 
     <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">bar</wsse:Password>  
     <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">foooooobar==</wsse:Nonce> 
     <wsu:Created>2010-01-25T13:09:24.860Z</wsu:Created> 
     </wsse:UsernameToken> 
    </wsse:Security> 

    </soapenv:Header> 

    <soapenv:Body> 
    <ns:fooBar>...</ns:fooBar> 
    </soapenv:Body> 

Ich habe heruntergeladen und installiert Microsoft WSE 3.0 SDK und einen Verweis auf die DLL in meinem Visual Studio 2005-Projekt hinzugefügt.

Ich habe jetzt Zugriff auf die Microsoft.Web.Services3. * Namespaces, aber ich bin derzeit ratlos, wie es weiter geht.

Der Client-Code wird automatisch von einer Web-Referenz erzeugt worden ist, so dass ich nur eine geringe Menge an Arbeit tun, um die Nachricht an den Server unauthenticated zu senden:

WS.FooResultHttpService ws = new WS.FooResultHttpService(); 
ws.Url = "http://foo.bar.baz"; 
ws.SendSomething(message); 

ich nur zu untersuchen begonnen habe mit Microsoft.Web.Services3.Security.Tokens.UsernameTokenManager, aber bis jetzt konnte ich nichts in Gang bringen.

Alle Hinweise würden sehr geschätzt werden, da ich keine guten Rezepte im Netz finden kann.

Danke!

Antwort

10

Habe es funktioniert, leider vor dem Lesen wsanville's great answer.

anderen zu helfen, ich bin Entsendung alle Schritte, die ich es die Arbeit mit Visual Studio 2005 erhalten tun musste:

  • Installieren WSE 3.0, wählen benutzerdefinierte und wählen Sie alles
  • lesen Implementing direct authentication with username token in WSE 3.0 für Hinweise
  • Relaunch Visual Studio 2005, jetzt klicken Sie mit der rechten Maustaste auf Ihr Projekt im Solution Explorer, und Sie sollten einen WSE Einstellungen 3.0 Menüpunkt haben und verwenden, wenn Sie möchten.
  • Aktualisieren Sie Ihre Webreferenzen, dies sollte eine neue HTTP-Web-Service-Proxy-Klasse mit einem anderen Namen, z. YourWsNameHttpServiceWse. Dies entspricht im Wesentlichen dem Ausführen wsewsdl3.exe
  • Verwenden Sie diese neue Klasse, und Sie sollten Zugriff auf WSE-Methoden und Eigenschaften wie SetClientCredential haben.

Ich landete fast alles im Code zu tun, stattdessen auf den Config-Dateien zu verlassen, die mit meiner C# DLL gebaut werden. Der Code endete wie folgt aussehen:

FooBarHttpServiceWse wse = new FooBarHttpServiceWse(); 

wse.SetClientCredential(new UsernameToken(
    "username", 
    "password", 
    PasswordOption.SendPlainText)); 

wse.SetPolicy(new FooBarPolicy()); 
wse.CallSomeServerFunction(yourRequest) 

ich meine eigene Politik geschaffen, die so aussah:

using Microsoft.Web.Services3.Design; 

// ... 

public class FooBarPolicy : Policy 
{ 
    public FooBarPolicy() 
    { 
     this.Assertions.Add(new UsernameOverTransportAssertion()); 
    } 
} 

Schließlich ist der WebSphere-Server antwortete, dass Ein erforderlicher Header eine Nachricht darstellt Adressierung Eigentum ist nicht vorhanden, und inspizieren der ausgehenden Nachricht (mit dem netten Tool Fiddler) Ich sah den SOAP-Fehler vom Server angezeigt, dass die Action-Header fehlte.

Ich versuchte vergeblich, mich das wsa:Action Element zu setzen:

using Microsoft.Web.Services3.Addressing; 

// ... 

wse.RequestSoapContext.Addressing.Action = new Action("CallSomeServerFunction"); 

Das Problem war, dass selbst wenn ich eine Aktion gesetzt, wenn es über den Draht geschickt wurde, war es leer. Es stellte sich heraus hatte ich die WSE-Proxy-Klasse zu öffnen und ein Attribut bearbeiten es:

[System.Web.Services.Protocols.SoapDocumentMethodAttribute(
    "---Edit this to set wsa:Action---", 
    Use=System.Web.Services.Description.SoapBindingUse.Literal, 
    ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)] 
// ... 
public SomeServerFunction(...) 

Danach, es ist alles gut geklappt.

12

Stellen Sie sicher, dass Ihre Proxy-Klasse von Microsoft.Web.Services3.WebServicesClientProtocol erbt.

Sie können dies tun, indem Sie entweder die Proxy-Klasse selbst ändern oder sie über die Befehlszeile mit wsewsdl3.exe mit dem Schalter /type:webClient generieren.

Sie können dann die Anmeldeinformationen wie folgt passieren:

using Microsoft.Web.Services3; 
using Microsoft.Web.Services3.Security.Tokens; 
using Microsoft.Web.Services3.Security; 
. 
. 
. 
WS.FooResultHttpService ws = new WS.FooResultHttpService(); 
ws.RequestSoapContext.Security.Tokens.Add(new UsernameToken("blah", "blah", PasswordOption.SendPlainText)); 

Dies ist, was ich in der Vergangenheit getan haben WSE3.0 zu bekommen in Studio 2008. Hoffnung gehen, das hilft.

+0

Danke, das war sehr hilfreich! – csl

+0

+1 sehr nützlich. Hatte ein Problem generieren Proxy mit WseWsdl3.exe auf VS2010, Dies wurde durch Hinzufügen von Eintrag in der Registrierung behoben. Fügen Sie den Zeichenfolgenschlüssel "sdkInstallRootv2.0" unter HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ .NETFramework \ mit dem Wert "C: \ Programme \ Microsoft SDKs \ Windows \ v6.0A" hinzu. – Siva

Verwandte Themen