2011-12-05 9 views
1

прежде всего, позвольте мне «предупредить» вас, что я не разработчик PHP и довольно не разбираюсь в PHP. Я являюсь разработчиком службы WCF, о которой идет речь, и пытаюсь поддержать разработчика PHP в штате, который пытается использовать эту услугу.Потребление службы WCF от PHP

Он не имеет логин StackOverflow и занят неоспоримым разозлился на WCF, чтобы что-нибудь типа без профанации ;-)

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

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

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

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

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

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

До сих пор мы пытаемся использовать WSE-PHP, который можно найти через google.

EDIT:

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

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 

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

http://XXXXXXXXXXXXXX/WCF/ICompany/TestConnection 

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

ответ

0

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

+0

Да, это мыло, проблема в том, что по какой-то причине PHP не поддерживает стандарты WS-Security из коробки. Поэтому вам необходимо расширить PHP самостоятельно или использовать библиотеку (обе из которых мы пока не смогли сделать). –

+0

Можете ли вы просто разместить на basicHttp? –

+1

Да, я могу ... но это на самом деле не решение, это ускользает от всей проблемы, делая что-то другое ...: P –

1

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

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

+0

Да, мы заглянули в библиотеку, но все примеры, которые можно найти в сервисах WS- * PHP, похоже, включает сертификаты. Теперь в фоновом режиме, возможно, есть какой-то сертификат mojo, но из того, что я вижу, когда я потребляю услугу, рукопожатие SAML выполняется с 3 запросами (и ответами), и после этого, используя i, ожидается, что информация из этого рукопожатия будет зашифрована и отправить на сервер. –

0

(это немного долго, чтобы добавить комментарий к ответу Визуальная Стюарта)

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

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

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

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

-

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

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

1

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

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

Вот некоторые другие помощники для вашего 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/

+0

Ну, я использовал скрипач, чтобы посмотреть на сделанные просьбы. Я дал их нашему разработчику PHP, и он, к сожалению, ничего не сделал для него. –

0

Если сервер настроен с 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> 

Следует помнить, что сервер может быть настроен на простой или хешированный пароль. Таким образом, клиент должен отправить простой или хешированный пароль.

1

После моей длинной тренировки для электронной почты службы 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.