如何使用 Delphi XE 发送 WCF 的 ClientCredentials

Posted

技术标签:

【中文标题】如何使用 Delphi XE 发送 WCF 的 ClientCredentials【英文标题】:How to send WCF's ClientCredentials using Delphi XE 【发布时间】:2011-08-31 01:17:12 【问题描述】:

我使用 HTTPS 开发了一个带有自定义 UserNamePasswordValidatorbasicHttpBinding 的 WCF 服务。它适用于 .Net 客户端,使用 ClientCredentials 发送用户名和密码以进行身份​​验证。

但是,我需要从 Delphi XE 客户端调用它。如何使用 Delphi 发送等效的 .Net ClientCredentials?那可能吗?如果是,怎么做?如果不是,是否有替代方案?

Tks

编辑

以下是我在 .Net 中的客户端代码:

EndpointAddress oTransac = new EndpointAddress(GetAddress());
using (WebServiceClient oClient = new WebServiceClient ("httpbasic", oTransac))

  oClient.ClientCredentials.UserName.UserName = "username";
  oClient.ClientCredentials.UserName.Password = "password";
  oClient.DoStuff();

编辑

我一直在做一些研究,我已经能够使用 SOAP Hearders 在 Delphi 和旧的 asmx Web 服务之间进行身份验证。我找到了下面的文章。使用本文的技术,我能否实现与旧的 [WebMethod] [System.Web.Services.Protocols.SoapHeader("SoapHeader")] 相同的行为?

http://weblogs.asp.net/paolopia/archive/2008/02/25/handling-custom-soap-headers-via-wcf-behaviors.aspx

编辑赏金

得到标记为赏金的正确答案,我希望能够在服务器端使用 WCF Service UserNamePasswordValidator 从 Delphi 调用 Web 服务。

【问题讨论】:

您可以通过 http 标头发送凭据对吗? 在 Delphi 中,是的...但由于它通过 HTTPS,我无法使用 Fiddler 读取消息中的 SOAP 标头,所以我不知道要发送什么。 你知道如何在 .Net 代码中手动格式化 SOAP Header 吗?如果你这样做,我也许可以将它转换为 Delphi。任何帮助都是帮助! Tks 看看 WCFextras wcfextras.codeplex.com 和 SoapHeader 类。 msdn.microsoft.com/en-us/library/… 有趣。我必须禁用 web.config 中的所有 WCF 默认安全配置,例如 TransportWithMessageCredential 和 UserNamePasswordValidator,然后通过 SOAP Header 手动正确地执行? 【参考方案1】:

首先,basicHttpBinding 是通过 HTTP(不是 HTTPS)

http://msdn.microsoft.com/en-us/library/ms731361.aspx

从 Delphi 使用 WFC 服务通常通过从服务生成 WSDL 来完成

How to create a single WSDL file from existing WCF service?

http://social.msdn.microsoft.com/Forums/en/wcf/thread/fc2c5074-1116-4f92-a972-01bb3a142535

WCF: how to generate a single WSDL document, without WSDL:import?

并通过将 WSDL 导入您的 Delphi 项目来生成 Delphi 代理类。

>wsdlimport.exe service.wsdl

然后在你的 Delphi 项目中使用生成的 Delphi 单元

http://www.drbob42.com/examines/examinB9.htm

http://edn.embarcadero.com/article/36962

您发送给服务调用的参数(用户名、密码、ClientCredentials 等)将在生成的 Delphi 单元中定义 - 只要您可以连接到服务,应该没问题。

【讨论】:

Tks。我已经完成了这一切。我最初想使用 WCF 的默认 UserNamePasswordValidator 和 web.config TransportWithMessageCredential 进行用户/密码验证,但我不知道如何将用户名/密码信息发送到 WCF(在 .net 中,使用 ClientCredentials 完成)。我现在正尝试在 WCF 中通过 SoapHeader 发送它,因为我已经通过 Delphi 成功调用了 SOAP Header。但是,如果这不起作用,我将通过参数将它们发送过来。 basicHttpBinding 不支持 TransportWithMessageCredential msdn.microsoft.com/en-us/library/ms789011.aspx 很有趣,但我确实让它与 Https 一起使用,并使用它发送用户名凭据。网络两端的客户端。通过方法参数发送用户名和密码很容易。您是否能够使用 WCF 和 Delphi 处理 SOAP 标头?我已经用旧的 asp.net 网络服务完成了它。 Tka 您确定.Net 客户端正在与basicHttpBinding 连接吗?您可以发布服务的 .config 文件或显示创建“httpbasic”端点的代码吗?是的,我有一个 delphi 客户端与一个暴露 basicHttpBinding 端点的 WCF 服务通信,但诀窍是使用 WCFExtras 创建一个“平面 wsdl”。 不,我没有在 SOAP 标头中发送用户名和密码。但我有一个 Delphi 客户端与 WCF 服务交谈。你的首要任务是什么?【参考方案2】:

几周前,我还必须连接到 WCF 服务。我最终在 .net 中编写客户端并使用 UnmanagedExports https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports

然后可以像原生 dll 一样在 Delphi 中使用该 dll

【讨论】:

这也是个好主意。这样您就可以保持安全性并且不再需要 basicHttpBinding 端点。也应该快很多。

以上是关于如何使用 Delphi XE 发送 WCF 的 ClientCredentials的主要内容,如果未能解决你的问题,请参考以下文章

如何在Delphi FireMonkey中发送iOS的推送通知

delphi xe10 怎么样

Delphi XE8如何同Eclipse使用相同的Android SDK?

delphi2009(10,xe)下indy10发送utf8字符串

delphi xe 自带的Android Demo程序 编译时正常,但当Run 时报如下错误,请大神帮忙看一下

Delphi XE IdTCPClient1 和 IdTCPServer1 数据的发送与接收(indy10)