首先让我"警告"你,我不是一个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>
请记住,服务器可以配置为接受普通或散列密码。因此客户端必须发送纯密码或哈希密码