Question

Je l'ai créé avec succès un client WS qui fonctionne correctement lorsque vous utilisez l'authentification pas.

Cependant, le serveur (WebSphere) nécessite maintenant l'ajout d'un jeton nom d'utilisateur ws-sécurité, et je vais avoir du mal à le faire. Le message SOAP résultant est censé ressembler à quelque chose comme ceci:

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

Je l'ai téléchargé et installé le SDK Microsoft de WSE 3.0 et ajouté une référence au projet DLL dans mon Visual Studio 2005.

J'ai maintenant accès au microsoft.web.services3. * Namespaces, mais je suis actuellement perplexe sur la façon de procéder.

Le code client a été généré automatiquement par une référence Web, donc je ne faire une petite quantité de travail pour envoyer le message au serveur non authentifié :

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

Je viens de commencer à enquêter sur l'utilisation Microsoft.Web.Services3.Security.Tokens.UsernameTokenManager, mais jusqu'à présent, je ne l'ai pas été en mesure d'obtenir quoi que ce soit et en cours d'exécution.

Les conseils seraient grandement appréciés, comme je ne peux pas sembler trouver de bonnes recettes sur le net.

Merci!

Était-ce utile?

La solution 2

Got it travail, malheureusement avant de lire grande réponse wsanville.

Pour aider les autres, je signale toutes les étapes que je devais faire pour le faire fonctionner avec Visual Studio 2005:

  • WSE 3.0 , choisissez coutume et sélectionnez tout
  • La mise en œuvre d'authentification directe avec jeton nom d'utilisateur dans WSE 3.0 conseils
  • Relancez Visual Studio 2005, maintenant un clic droit sur votre projet dans l'explorateur de solution, et vous devriez avoir une WSE Réglages 3.0 élément de menu et utiliser que si vous voulez.
  • Mettez à jour vos références Web, cela devrait créer une nouvelle classe de proxy de service Web HTTP, avec un nom différent, par exemple YourWsNameHttpServiceWse. Ceci est essentiellement le même que la course wsewsdl3.exe
  • Utilisez cette nouvelle classe, et vous devriez avoir accès à des méthodes WSE et propriétés, telles que SetClientCredential.

J'ai fini par faire presque tout dans le code, au lieu de compter sur les fichiers-config qui sont construits avec mon C # DLL. Le code a fini par ressembler à ceci:

FooBarHttpServiceWse wse = new FooBarHttpServiceWse();

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

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

J'ai créé ma propre politique, qui ressemblait à ceci:

using Microsoft.Web.Services3.Design;

// ...

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

Enfin, le serveur WebSphere a répondu que Un en-tête nécessaire représentant un message d'adressage de la propriété n'est pas présent , et inspecter le message sortant (en utilisant l'outil agréable Fiddler ) J'ai vu la faute SOAP du serveur indiqué que l'en-tête d'action était manquante.

J'ai essayé en vain de mettre l'élément wsa:Action moi-même:

using Microsoft.Web.Services3.Addressing;

// ...

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

Le problème est que même si je mets une action, quand il a été envoyé sur le fil, il était vide. Avéré que je devais ouvrir la classe proxy WSE et modifier un attribut il:

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

Après cela, tout cela a bien fonctionné.

Autres conseils

Assurez-vous que votre classe proxy hérite de Microsoft.Web.Services3.WebServicesClientProtocol.

Vous pouvez faire cela en changeant la classe proxy lui-même, ou en générant via la ligne de commande en utilisant wsewsdl3.exe avec le commutateur /type:webClient.

Vous pouvez ensuite transmettre les informations d'identification comme ceci:

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

est ce que je l'ai fait dans le passé pour obtenir WSE3.0 aller au Studio 2008. L'espoir qui aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top