Использование службы WCF из PHP - PullRequest
1 голос
/ 05 декабря 2011

Во-первых, позвольте мне "предупредить", что я не являюсь разработчиком PHP и довольно не разбираюсь в PHP. Я являюсь разработчиком рассматриваемой службы WCF и пытаюсь поддержать разработчика PHP в штате, который пытается использовать эту службу.

У него нет логина в Stackoverflow, и он очень зол на WCF, чтобы набрать что-нибудь без ненормативной лексики; -)

В любом случае, служба использует следующую конфигурацию безопасности:

<security mode="Message">
   <message clientCredentialType="UserName" negotiateServiceCredential="true" algorithmSuite="Default" />
</security>

Это означает, что сообщение зашифровано по линии, я считаю, что для этого требуется сертификат, который был установлен на веб-сервере, и при использовании службы из .NET работает без каких-либо проблем.

Мы рассмотрели связь фиддлера и подозреваем, что RequestSecurityTokenResponse имеет значение. Я подозреваю, что рукопожатие, когда клиент запрашивает маркер безопасности, генерируется с GUID в качестве ссылки, значение используется для шифрования запроса, а GUID отправляется в качестве ссылки.

Хотя это все предположения, так что пока мы не смогли получить запросы, даже удаленно выглядящие одинаково.

Любые указатели в правильном направлении будут высоко оценены.

Пока что мы пытаемся это сделать с помощью WSE-PHP, который можно найти через Google.

EDIT:

Мы смогли подтвердить свои мысли с Fiddler, и работающие клиенты, похоже, совершают рукопожатие, всего есть три запроса (и ответа), которые, кажется, обмениваются только информацией о безопасности, они вызывают следующие действия:

http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue
http://schemas.xmlsoap.org/ws/2005/02/trust/RSTR/Issue
http://schemas.xmlsoap.org/ws/2005/02/trust/RST/SCT

После этого последнего вызова делается запрос с действием, которое, по-видимому, указывает на вызов фактического метода веб-сервиса:

http://XXXXXXXXXXXXXX/WCF/ICompany/TestConnection

Это, похоже, связано с SAML (я люблю тебя, Google), поэтому я добавил это как тег.

Ответы [ 6 ]

1 голос
/ 25 февраля 2015

После моей долгой тренировки для сервиса Email WCF с вложением. Теперь я могу отправить письмо из PHP, используя сервис WCF. Вот фрагмент кода.

<?php
ini_set('display_errors',1);
require_once ('nusoap.php');


$parameters= new StdClass();
$parameters->emailinfo = new StdClass();


$fileAttachmentPath = 'example.csv'; 
$data = base64_encode(file_get_contents($fileAttachmentPath));
$parameters->emlinfo->NoFileInfo = true;
$parameters->emlinfo->FileNameWithExt = "example.csv";
$parameters->emlinfo->FileContentBase64 = $data;

//$parameters->emlinfo->FileAttachment = $parameters->ArrayOfFileAttachment;

//$parameters->emlinfo->FileAttachment = (array) $parameters->emlinfo->FileAttachment;

$parameters->emlinfo->MailTo='';
$parameters->emlinfo->MailFrom='';
$parameters->emlinfo->MailMessage='';
$parameters->emlinfo->MailBody='';
$parameters->emlinfo->MailSubject='';
$parameters->emlinfo->MailType='';
$parameters->emlinfo->UserId='';
$parameters->emlinfo->Password='';
$parameters->emlinfo->SmtpId='';
$parameters->emlinfo->Token='';
$parameters->emlinfo->ApplicationId='';
$parameters->emlinfo->VisitorName='';
$parameters->emlinfo->VendorId='';
$parameters->emlinfo->ReplyTo='';

try {

$braspag = new SoapClient('WSDL Sevice',

        array(
                'trace'                 => 1,
                'exceptions'            => 1,
                'style'                 => SOAP_DOCUMENT,
                'use'                   => SOAP_LITERAL,
                'soap_version'          => SOAP_1_1,
                'encoding'              => 'UTF-8'
        )

);

//$SendEmailResponse = $braspag->__getTypes();
$SendEmailResponse  = $braspag->SendEmail($parameters);
}
catch(SoapFault $fault) {
//echo 'Ocorreu um erro: ' , $fault->getMessage();
}

var_dump($parameters->emlinfo);
?>

Regards,
Rahul Soni.
1 голос
/ 15 декабря 2011

Почему бы вам не настроить независимый от платформы проект пользовательского интерфейса, используя что-то вроде SOAP UI, где он позволит вам проводить автоматические тесты для вашей службы WCF, гарантируя, что ваши контракты будут надежными и приносят пользу потребителю PHP. Причина, по которой это приносит пользу потребителю PHP, заключается в том, что у него будут автоматические тестовые случаи, которые он может профилировать / запускать / использовать в качестве предварительного кандидата, чтобы использовать его в php.

Следует отметить, что пространство имен .net может вызвать проблемы для других языков с SOAP. Я действительно рекомендую вам изучить SOAP UI или бесплатную альтернативу. Возможно, альтернативой, которая является бесплатной, является fiddler, однако я считаю, что она не автоматизирована.

Вот некоторые другие помощники для вашего потребителя PHP: http://weblogs.asp.net/gunnarpeipman/archive/2007/09/17/using-wcf-services-with-php.aspx http://cgeers.com/2009/08/20/using-wcf-services-with-php-5/

1 голос
/ 06 декабря 2011

Да, в PHP есть поддержка WS-Security. Некоторая сборка требуется. См., Например, Защищенные веб-службы с PHP . Спецификации WS- * написаны и реализованы для обеспечения совместимости, то есть для работы на разных платформах, поставщиках, транспортах и ​​языках. Он получил широкое распространение, а версия 1.1 является стандартом OASIS с 2006 года.

Возможно, это помогло бы разрядить тенон и было бы поучительно, если бы ваш PHP-разработчик продемонстрировал способность использовать любой веб-сервис, использующий WS-Security, только для того, чтобы ненадолго вывести ваш сервис и WCF из уравнения.

0 голосов
/ 16 декабря 2011

Если сервер настроен на clientCredentialType="UserName" Потребитель PHP должен использовать некоторую реализацию WS-Security для отправки заголовков безопасности SOAP имени пользователя и пароля на сервер.

<soapenv:Envelope>  
<soapenv:Header>
<wsse:Security >
<wsse:UsernameToken>
<wsse:Username>bob</ wsse:Username>
<wsse:Password Type="PasswordText">bob1</ wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body> ... </soapenvBody> 
</soapenv:Envelope>

Имейте в виду, что сервер может бытьнастроить для принятия простого или хешированного пароля.Поэтому клиент должен отправить простой или хешированный пароль.

0 голосов
/ 11 декабря 2011

(это немного длинно, чтобы добавить в качестве комментария к ответу Visual Stewart)

clientCredentialType = "UserName" .... Это означает, что сообщение зашифровано по строке

Не совсем.Сообщение не зашифровано, но оно будет отправлено через SSL.Из опубликованных документов :

Имя пользователя

Позволяет службе требовать, чтобы клиент проходил проверку подлинности с использованием учетных данных имени пользователя.Обратите внимание, что WCF не допускает никаких криптографических операций с именами пользователей , таких как создание подписи или шифрование данных.WCF обеспечивает безопасность транспорта при использовании учетных данных имени пользователя.

-

Обратите внимание на разницу между сообщением и транспортом.

Аутентификация может быть полученным из клиентского сертификата, используемого для транспортировки или согласованного (NTLM).

0 голосов
/ 05 декабря 2011

Я мало что знаю о WCF, но похоже, что он основан на SOAP. Вы можете начать с просмотра функций php Soap . Я вижу, что также поддерживает связь JSON, проверьте JSON функции с php.

...