1

首先让我“警告”你,我不是 PHP 开发人员,我对 PHP 一无所知。我是有问题的 WCF 服务的开发人员,我正在尝试支持正在尝试使用此服务的员工中的 PHP 开发人员。

他没有 Stackoverflow 登录名,正忙着在 WCF 上发脾气,因为他在没有亵渎的情况下输入任何内容;-)

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

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

这意味着消息是通过线路加密的,我相信这需要一个已安装在网络服务器上的证书,并且在从 .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

在最后一次调用之后,会发出一个请求,其中一个动作似乎表明调用了实际的 web 服务方法:

http://XXXXXXXXXXXXXX/WCF/ICompany/TestConnection

这似乎与 SAML(我爱你 google)有关,所以我将其添加为标签。

4

6 回答 6

1

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

于 2011-12-14T22:13:06.057 回答
1

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

如果您的 PHP 开发人员能够展示使用任何使用 WS-Security 的 Web 服务的能力,这可能会有助于化解矛盾并具有指导意义,只是暂时将您的服务和 WCF 排除在等式之外。

于 2011-12-06T05:47:40.153 回答
1

在我长时间锻炼了带有附件的电子邮件 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.
于 2015-02-25T07:30:55.340 回答
0

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

于 2011-12-05T15:08:14.417 回答
0

(作为评论添加到 Visual Stewart 的答案有点长)

clientCredentialType="UserName"....这意味着消息通过线路加密

并不真地。该消息加密,但将通过 SSL 发送。从已发布的文档中:

用户名

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

--

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

身份验证可能源自用于传输的客户端证书,也可能源自协商 (NTLM)。

于 2011-12-11T11:21:49.507 回答
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>

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

于 2011-12-16T10:42:10.780 回答