Pregunta

He creado con éxito un cliente WS que funciona correctamente cuando no se utiliza la autenticación.

Sin embargo, el servidor (WebSphere) requiere ahora la adición de un nombre de usuario WS-token de seguridad, y estoy teniendo dificultades para hacer esto. El mensaje SOAP resultante se supone que debe ser algo como esto:

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

He descargado e instalado WSE 3.0 SDK de Microsoft y ha añadido una referencia a la DLL en mi proyecto de Visual Studio 2005.

Ahora tengo acceso a la Microsoft.Web.Services3. * Espacios de nombres, pero actualmente estoy confundido sobre cómo proceder.

El código de cliente se ha generado automáticamente por un web de referencia, por lo que sólo hago una pequeña cantidad de trabajo para enviar el mensaje al servidor no autenticado

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

he empezado a investigar el uso de Microsoft.Web.Services3.Security.Tokens.UsernameTokenManager, pero hasta ahora no han sido capaces de conseguir cualquier cosa en marcha y funcionando.

¿Alguna pista sería muy apreciado, ya que parece que no puede encontrar recetas buenas en la red.

Gracias!

¿Fue útil?

Solución 2

tengo trabajo, por desgracia, antes de leer wsanville de gran respuesta .

Para ayudar a los demás, les dejo todos los pasos que tenía que hacer para que funcione con Visual Studio 2005:

  • WSE 3.0 , elija costumbre y seleccione todo
  • de aplicación con nombre de usuario de ficha en WSE 3.0 para consejos
  • Relanzamiento Visual Studio 2005, ahora haga clic en su proyecto en el explorador de soluciones, y usted debe tener un Configuración WSE 3.0 elemento de menú y el uso que, si así lo desea.
  • Actualización de sus referencias web, esto debe crear una nueva clase de servicio web proxy HTTP, con un nombre diferente, por ejemplo, YourWsNameHttpServiceWse. Esta es esencialmente la misma que ejecutar wsewsdl3.exe
  • Utilice esta nueva clase, y usted debe tener acceso a los métodos y propiedades WSE, como SetClientCredential.

terminé haciendo casi todo en código, en lugar de depender de los config-archivos que se construyen con mi C # DLL. El código terminó con este aspecto:

FooBarHttpServiceWse wse = new FooBarHttpServiceWse();

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

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

He creado mi propia política, que se veía así:

using Microsoft.Web.Services3.Design;

// ...

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

Por último, el servidor WebSphere respondió que Un encabezado requiere que representa un direccionamiento de mensajes propiedad no está presente , e inspeccionar el mensaje de salida (utilizando la herramienta agradable el violinista ) vi el error de SOAP del servidor indica que la cabecera de Acción faltaba.

Me trató en vano de establecer el elemento wsa:Action a mí mismo:

using Microsoft.Web.Services3.Addressing;

// ...

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

El problema fue que, incluso si fijo una acción, cuando fue enviado a través del cable, que estaba vacío. Resultó que tenía que abrir la clase WSE proxy y editar un atributo existe:

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

Después de eso, todo salió muy bien.

Otros consejos

Asegúrese de que sus hereda de la clase de proxy de Microsoft.Web.Services3.WebServicesClientProtocol.

Se puede hacer esto ya sea cambiando la propia clase proxy, o generando que a través de la línea de comandos usando wsewsdl3.exe con el interruptor /type:webClient.

A continuación, puede pasar las credenciales de esta manera:

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

Esto es lo que he hecho en el pasado para obtener WSE3.0 ir en Studio 2008. Espero que ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top