Как передать учетные данные имени пользователя и пароля от клиента php в службу wcf, размещенную на собственной машине?
У меня есть собственный wcf сервис, который просто добавляет 2 числа и возвращает значение. Он работает нормально, но я не уверен, как я могу отправить имя пользователя и пароль через php-клиент, поэтому он будет проверяться на мой CustomUserNamePasswordValidator. Вот реализация для метода Add:
public class MathService : IMathService
{
public double Add(double x, double y)
{
return x + y;
}
}
Вот мой текущий App.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>
Я запускаю сервис, как это:
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();
}
Для клиента php я делаю:
<?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;
?>
Вышеуказанное работает нормально без аутентификации, но я хочу иметь возможность аутентифицировать имя пользователя и пароль из phpclient. Когда они пытаются получить доступ к моей службе, я хочу, чтобы имя пользователя и пароль были проверены с помощью переопределенного метода Validate в UserNamePasswordValidator, который в настоящее время определяется как:
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");
}
Я просто использую test и test в качестве примера для имени пользователя и пароля. Я знаю, что должен установить модификацию конфигурации поведения и выполнить настройку привязки, чтобы служба использовала CustomUserNamePasswordValidator, но, поскольку я не знаю PHP, я не знаю, как отправлять учетные данные из php в службу wcf и как только учетные данные отправлены, я не знаю, как установить это в сервисе wcf. Я не создаю службу wcf. Я думал, что смогу сделать client.ClientCredentials.UserName.UserName
а также client.ClientCredentials.UserName.Password
, но это только если я создаю.NET-клиент, которым я не являюсь.
Другой вопрос, который у меня возник, заключался в том, что, если клиент является клиентом php, я ограничен только basicHttpBinding?
Кроме того, в идеале я хотел бы отправить запрос мыла от php-клиента в службу wcf, так что если кто-то может указать мне правильное направление для этого, было бы здорово.
Я просто попробовал следующее, но это не сработало (был вызван Add, но он не был аутентифицирован)
$sh_param = array('userName' => 'test', 'passWord' => 'test2');
$headers = new SoapHeader('http://localhost:8731/MathService.svc','UserCredentials',
$sh_param,false);
$client->__setSoapHeaders(array($headers));
ОБНОВЛЕНИЕ: Моя инициализация клиента PHP Soap теперь:
$client = new SoapClient('http://localhost:8731/MathService?wsdl',
array('login' => "test2",
'password' => "test",
'trace'=>1));
Выполнив вышесказанное, он добавил в запрос следующее:
`Authorization: Basic dGVzdDI6dGVzdA==`
Тем не менее, моя служба wcf, которая размещена в консольном приложении, не получает эту авторизацию, у меня есть специальный валидатор имени пользователя, который имеет жестко запрограммированное значение test для имени пользователя и test для пароля, но когда я пытаюсь "test2"для входа в систему он все еще вызывает метод. Я использую TransportWithCredentialOnly и Message="UserName"
1 ответ
Попробуйте перегрузить конструктор SoapClient:
$client = new SoapClient("some.wsdl", array('login' => "some_name",
'password' => "some_password"));
И вот документация: http://www.php.net/manual/pl/soapclient.soapclient.php