Domanda

Ho creato con successo un client WS che funziona correttamente quando NON si utilizza l'autenticazione.

Tuttavia, il server (WebSphere) ora richiede l'aggiunta di un token nome utente ws-security e ho difficoltà a farlo.Il messaggio SOAP risultante dovrebbe assomigliare a questo:

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

Ho scaricato e installato l'SDK WSE 3.0 di Microsoft e ho aggiunto un riferimento alla DLL nel mio progetto Visual Studio 2005.

Ora ho accesso agli spazi dei nomi Microsoft.Web.Services3.*, ma al momento sono perplesso su come procedere.

Il codice client è stato generato automaticamente da un riferimento web, quindi faccio solo una piccola quantità di lavoro per inviare il messaggio al server non autenticato:

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

Ho appena iniziato a indagare sull'utilizzo Microsoft.Web.Services3.Security.Tokens.UsernameTokenManager, ma finora non sono riuscito a far funzionare nulla.

Qualsiasi suggerimento sarebbe molto apprezzato perché non riesco a trovare nessuna buona ricetta in rete.

Grazie!

È stato utile?

Soluzione 2

Funziona, purtroppo prima di leggerlo L'ottima risposta di Wsanville.

Per aiutare gli altri, sto pubblicando tutti i passaggi necessari per farlo funzionare con Visual Studio 2005:

  • Installare WSE3.0, scegliere costume e seleziona tutto
  • Leggere Implementazione dell'autenticazione diretta con token nome utente in WSE 3.0 per suggerimenti
  • Riavvia Visual Studio 2005, ora fai clic con il pulsante destro del mouse sul tuo progetto in Esplora soluzioni e dovresti avere un Impostazioni WSE 3.0 voce di menu e utilizzala se lo desideri.
  • Aggiorna i tuoi riferimenti web, questo dovrebbe creare una nuova classe proxy del servizio web HTTP, con un nome diverso, ad es. YourWsNameHttpServiceWse.Questo è essenzialmente lo stesso della corsa wsewsdl3.exe
  • Usa questa nuova classe e dovresti avere accesso ai metodi e alle proprietà WSE, come SetClientCredential.

Alla fine ho fatto quasi tutto in codice, invece di fare affidamento sui file di configurazione creati con la mia DLL C#.Il codice alla fine è apparso così:

FooBarHttpServiceWse wse = new FooBarHttpServiceWse();

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

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

Ho creato la mia policy, che assomigliava a questa:

using Microsoft.Web.Services3.Design;

// ...

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

Alla fine, il server WebSphere ha risposto Un'intestazione obbligatoria che rappresenta una proprietà di indirizzamento dei messaggi non è presente, e controllando il messaggio in uscita (usando lo strumento nice Violinista) Ho visto l'errore SOAP dal server che indicava che mancava l'intestazione dell'azione.

Ho provato invano a impostare il wsa:Action elemento me stesso:

using Microsoft.Web.Services3.Addressing;

// ...

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

Il problema era che anche se impostavo un'azione, quando veniva inviata via cavo, era vuota.Si è scoperto che dovevo aprire la classe proxy WSE e modificare un attributo lì:

[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(...)

Dopodiché, tutto ha funzionato bene.

Altri suggerimenti

Assicurati che il tuo classe proxy eredita da Microsoft.Web.Services3.WebServicesClientProtocol.

È possibile eseguire questa operazione modificando la classe proxy stesso, o generando tramite la riga di comando utilizzando wsewsdl3.exe con l'interruttore /type:webClient.

È quindi possibile passare le credenziali in questo modo:

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

Questo è quello che ho fatto in passato per ottenere WSE3.0 andare in Studio 2008. Speranza che aiuta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top