¿Cómo paso las credenciales de nombre de usuario / contraseña de PHP Client al servicio WCF auto-alojado?

StackOverflow https://stackoverflow.com/questions/6059524

Pregunta

Tengo un servicio WCF de alojamiento auto alojado que solo agrega 2 números y devuelve el valor. Funciona bien, pero no estoy seguro de cómo puedo enviar el nombre de usuario y la contraseña a través del cliente PHP, por lo que validará contra mi CustomUsernamePasswordValidator. Aquí está la implementación para el método ADD:

public class MathService : IMathService
{
    public double Add(double x, double y)
    {
        return x + y;
    } 
}

Aquí está mi aplicación actual.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
  <service behaviorConfiguration="MyServiceBehavior" name="WcfWithPhp.MathService">
    <endpoint address="" binding="basicHttpBinding" contract="WcfWithPhp.IMathService">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8731/MathService" />
      </baseAddresses>
    </host>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="MyServiceBehavior">
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
    </behavior>
  </serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>

Estoy empezando el servicio como este:

static void Main(string[] args)
{
    ServiceHost host = new ServiceHost(typeof(WcfWithPhp.MathService));
    host.Open();

    Console.WriteLine("Math Service Host");
    Console.WriteLine("Service Started!");

    foreach (Uri address in host.BaseAddresses)
    {
        Console.WriteLine("Listening on " + address);
    }

    Console.WriteLine("Press any key to close the host...");
    Console.ReadLine();
    host.Close();
}

Para el cliente PHP, estoy haciendo:

<?php

header('Content-Type: text/plain');

echo "WCF Test\r\n\r\n";

// Create a new soap client based on the service's metadata (WSDL)
$client = new SoapClient("http://localhost:8731/MathService?wsdl");

$obj->x = 2.5;
$obj->y = 3.5;

$retval = $client->Add($obj);

echo "2.5 + 3.5 = " . $retval->AddResult;

?>

El anterior funciona bien sin autenticación, pero quiero poder autenticar el nombre de usuario y la contraseña del PHPClient. Cuando intentan acceder a mi servicio, quiero que el nombre de usuario y la contraseña validan a través del método de validación de Overrideren del nombre de usuario, que se define actualmente como:

public override void Validate(string userName, string password)
{
        if (string.IsNullOrEmpty(userName))
            throw new ArgumentNullException("userName");
        if (string.IsNullOrEmpty(password))
            throw new ArgumentNullException("password");

        // check if the user is not test
        if (userName != "test" || password != "test")
            throw new FaultException("Username and Password Failed");
 }

Solo estoy usando la prueba y la prueba como ejemplo para el nombre de usuario y la contraseña. Sé que tengo que configurar la configuración de la conducta y hacer una configuración de enlace, por lo que el servicio usará el personalizado personalizado, pero como no sé PHP, no estoy seguro de cómo enviar las credenciales de PHP al servicio WCF y Una vez que se envíen las credenciales, no sé cómo configurarlo en el servicio WCF. No estoy creando un servicio WCF. Pensé que podía hacer client.ClientCredentials.UserName.UserName y client.ClientCredentials.UserName.Password, pero esto es solo si estoy creando un cliente .NET, que no lo soy.

Otra pregunta que tuve fue que si el cliente es un cliente PHP, ¿estoy restringido a SOLO BASICHTTPBINDING?

Además, idealmente lo que me gustaría hacer es enviar una solicitud de SOAP del cliente PHP al servicio WCF, por lo que si alguien puede apuntarme en la dirección correcta para esto, sería genial.

Acabo de probar lo siguiente, pero no funcionó (se llamó ADD, pero no fue autenticado)

$sh_param = array('userName' => 'test', 'passWord' => 'test2');

$headers = new SoapHeader('http://localhost:8731/MathService.svc','UserCredentials',   
$sh_param,false);

$client->__setSoapHeaders(array($headers));

Actualización: Mi inicialización del cliente PHP SOAP es ahora:

$client = new SoapClient('http://localhost:8731/MathService?wsdl',
                         array('login' => "test2", 
                               'password' => "test",
                               'trace'=>1));

haciendo lo anterior, agregó lo siguiente en la solicitud:

`Authorization: Basic dGVzdDI6dGVzdA==`

Sin embargo, mi servicio WCF que se encuentra alojado en una aplicación de consola, no está recogiendo esta autorización, tengo un validador de nombre de usuario personalizado que tiene un valor de prueba codificado para el nombre de usuario y la prueba de la contraseña, pero cuando Pruebe "Test2" para el inicio de sesión, todavía está llamando al método. Estoy usando TransportWithCrenentialOnly y Message="Nombre de usuario"

¿Fue útil?

Solución

Try SoapClient constructor overload:

$client = new SoapClient("some.wsdl", array('login'    => "some_name",
                                            'password' => "some_password"));

And here is the doc: http://www.php.net/manual/pl/soapclient.soapclient.php

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