Frage

Ich habe erfolgreich einen WS-Client erstellt, der korrekt funktioniert, wenn KEINE Authentifizierung verwendet wird.

Allerdings erfordert der Server (WebSphere) jetzt das Hinzufügen eines ws-security-Benutzernamen-Tokens, und es fällt mir schwer, dies zu tun.Die resultierende SOAP-Nachricht sollte etwa so 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 das WSE 3.0 SDK von Microsoft heruntergeladen und installiert und in meinem Visual Studio 2005-Projekt einen Verweis auf die DLL hinzugefügt.

Ich habe jetzt Zugriff auf die Microsoft.Web.Services3.*-Namespaces, weiß aber derzeit nicht, wie ich vorgehen soll.

Der Client-Code wurde automatisch durch eine Webreferenz generiert, sodass ich nur einen geringen Arbeitsaufwand für das Senden der Nachricht an den Server aufwende nicht authentifiziert:

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

Ich habe gerade begonnen, die Verwendung zu untersuchen Microsoft.Web.Services3.Security.Tokens.UsernameTokenManager, aber bisher konnte ich noch nichts zum Laufen bringen.

Für Hinweise wäre ich sehr dankbar, da ich im Internet keine guten Rezepte finden kann.

Danke!

War es hilfreich?

Lösung 2

Hatte es funktioniert, leider vor dem Lesen Wsanvilles tolle Antwort.

Um anderen zu helfen, veröffentliche ich alle Schritte, die ich ausführen musste, damit es mit Visual Studio 2005 funktioniert:

  • Installieren WSE 3.0, wählen Brauch und alles auswählen
  • Lesen Implementierung der direkten Authentifizierung mit Benutzernamen-Token in WSE 3.0 für Hinweise
  • Starten Sie Visual Studio 2005 neu, klicken Sie nun im Projektmappen-Explorer mit der rechten Maustaste auf Ihr Projekt, und Sie sollten ein haben WSE-Einstellungen 3.0 Menüpunkt und verwenden Sie diesen, wenn Sie möchten.
  • Aktualisieren Sie Ihre Webreferenzen. Dadurch sollte eine neue HTTP-Webdienst-Proxy-Klasse mit einem anderen Namen erstellt werden, z. B. YourWsNameHttpServiceWse.Das ist im Wesentlichen dasselbe wie Laufen wsewsdl3.exe
  • Wenn Sie diese neue Klasse verwenden, sollten Sie Zugriff auf WSE-Methoden und -Eigenschaften haben, z SetClientCredential.

Am Ende habe ich fast alles im Code gemacht, anstatt mich auf die Konfigurationsdateien zu verlassen, die mit meiner C#-DLL erstellt wurden.Am Ende sah der Code so aus:

FooBarHttpServiceWse wse = new FooBarHttpServiceWse();

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

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

Ich habe meine eigene Richtlinie erstellt, die so aussah:

using Microsoft.Web.Services3.Design;

// ...

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

Schließlich antwortete der WebSphere-Server darauf Ein erforderlicher Header, der eine Nachrichtenadressierungseigenschaft darstellt, ist nicht vorhanden, und Überprüfen der ausgehenden Nachricht (mit dem netten Tool Geiger) Ich habe gesehen, dass der SOAP-Fehler vom Server darauf hinwies, dass der Action-Header fehlte.

Ich habe vergeblich versucht, das einzustellen wsa:Action Element selbst:

using Microsoft.Web.Services3.Addressing;

// ...

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

Das Problem bestand darin, dass selbst wenn ich eine Aktion festgelegt hatte, diese leer war, als sie über die Leitung gesendet wurde.Es stellte sich heraus, dass ich die WSE-Proxy-Klasse öffnen und dort ein Attribut bearbeiten musste:

[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 hat alles gut geklappt.

Andere Tipps

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

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

Anschließend können Sie die Anmeldeinformationen wie folgt übergeben:

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));

Das habe ich in der Vergangenheit getan, um WSE3.0 in Studio 2008 zum Laufen zu bringen.Hoffentlich hilft das.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top