从PHP中使用WCF服务


Consuming a WCF Service from PHP

首先让我"警告"你,我不是一个PHP开发人员,对PHP一无所知。我是正在讨论的WCF服务的开发人员,并且正在尝试支持正在尝试使用此服务的PHP开发人员。

他没有Stackoverflow登录,而且忙于在WCF上生气而不能键入任何没有亵渎的东西;-)

无论如何,该服务正在使用以下安全配置:

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

这意味着消息是在线加密的,我相信这需要一个已经安装在web服务器上的证书,当从。net消费服务时,没有任何问题。

我们已经研究了提琴通信,并怀疑RequestSecurityTokenResponse是重要的。我怀疑客户端请求安全令牌的握手,这是用GUID作为引用生成的,该值用于加密请求,GUID作为引用发送。

这些都是猜测,到目前为止,我们还无法让请求看起来完全相同。

如能指点,不胜感激。

到目前为止,我们正在尝试使用WSE-PHP,可以通过google找到。

编辑:

我们已经能够与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

在最后一个调用之后,一个请求用一个动作发出,这个动作似乎表明调用了实际的webservice方法:

http://XXXXXXXXXXXXXX/WCF/ICompany/TestConnection

这似乎与SAML (i love you google)有关,所以我将其添加为标签

是的,PHP中支持WS-Security。一些组装是必需的。例如,请参阅使用PHP的安全Web服务。WS-*规范是为互操作性而编写和实现的,也就是说,它可以跨不同的平台、供应商、传输和语言运行。它被广泛采用,自2006年以来,1.1版本已成为OASIS标准。

如果您的PHP开发人员能够显示使用任何使用WS-Security的web服务的能力,只是为了将您的服务和WCF暂时排除在等式之外,也许这将有助于缓和紧张局势并具有指导意义。

经过我长时间的锻炼,电子邮件WCF服务与附件。现在我可以使用WCF服务从PHP发送电子邮件。以下是代码片段:

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

为什么不使用SOAP UI之类的东西建立一个独立于平台的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.aspxhttps://github.com/geersch/WcfServicesWithPhp5

我不太了解WCF,但它似乎是基于SOAP的。您可以从php Soap函数开始。我看到它也支持JSON通信,从php检查JSON函数

(在Visual Stewart的回答中添加评论有点长)

clientCredentialType = "用户名"……这意味着消息通过

行加密。

没有。消息是未加密的,但它将通过SSL发送。来自已发布的文档:

用户名

允许服务要求使用用户名凭据对客户端进行身份验证。请注意,WCF不允许使用用户名进行任何加密操作,例如生成签名或加密数据。WCF确保在使用用户名凭据时传输是安全的。

,

注意消息和传输之间的区别。

身份验证可以从用于传输或协商(NTLM)的客户端证书派生。

如果服务器配置了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>

请记住,服务器可以配置为接受普通或散列密码。因此客户端必须发送纯密码或哈希密码