Comment transmettre les informations d'identification du nom d'utilisateur/mot de passe du client php au service WCF auto-hébergé ?

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

Question

J'ai un service WCF auto-hébergé qui ajoute simplement 2 nombres et renvoie la valeur.Cela fonctionne bien, mais je ne sais pas comment envoyer le nom d'utilisateur et le mot de passe via le client php, donc il sera validé par rapport à mon CustomUserNamePasswordValidator.Voici l'implémentation de la méthode Add :

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

Voici mon App.Config actuel :

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

Je démarre le service comme ceci :

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

Pour le client php, je fais :

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

?>

Ce qui précède fonctionne bien sans authentification, mais je souhaite pouvoir authentifier le nom d'utilisateur et le mot de passe du client php.Lorsqu'ils tentent d'accéder à mon service, je souhaite que le nom d'utilisateur et le mot de passe soient validés via la méthode Validate remplacée de UserNamePasswordValidator, qui est actuellement définie comme :

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

J'utilise simplement test et test comme exemple pour le nom d'utilisateur et le mot de passe.Je sais que je dois définir la configuration de modification du comportement et effectuer une configuration de liaison, donc le service utilisera CustomUserNamePasswordValidator, mais comme je ne connais pas PHP, je ne sais pas comment envoyer les informations d'identification de php au service wcf et une fois les informations d'identification envoyées, je ne sais pas comment les définir dans le service WCF.Je ne crée pas de service WCF.Je pensais que je pourrais le faire client.ClientCredentials.UserName.UserName et client.ClientCredentials.UserName.Password, mais ce n'est que si je crée un client .NET, ce que je ne suis pas.

Une autre question que je me posais était la suivante : si le client est un client PHP, suis-je limité uniquement à basicHttpBinding ?

De plus, idéalement, ce que j'aimerais faire est d'envoyer une demande de savon du client php au service wcf, donc si quelqu'un peut m'orienter dans la bonne direction pour cela, ce serait génial.

Je viens d'essayer ce qui suit, mais cela n'a pas fonctionné (Add a été appelé, mais il n'a pas été authentifié)

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

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

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

MISE À JOUR:L'initialisation de mon client PHP Soap est maintenant :

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

En procédant comme ci-dessus, il a ajouté ce qui suit dans la demande :

`Authorization: Basic dGVzdDI6dGVzdA==`

Cependant, mon service WCF, hébergé dans une application console, ne récupère pas cette autorisation. J'ai un validateur de nom d'utilisateur personnalisé qui a une valeur codée en dur de test pour le nom d'utilisateur et de test pour le mot de passe, mais lorsque j'essaye "test2 " pour la connexion, il appelle toujours la méthode.J'utilise TransportWithCredentialOnly et Message="UserName"

Était-ce utile?

La solution

Essayez la surcharge du constructeur SoapClient :

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

Et voici la doc : http://www.php.net/manual/pl/soapclient.soapclient.php

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