【问题标题】:Delphi SOAP Client Windows authentication broken since Delphi 10.3Delphi SOAP 客户端 Windows 身份验证自 Delphi 10.3 起被破坏
【发布时间】:2019-08-27 02:46:06
【问题描述】:

我们的 Delphi 客户端应用程序使用 THTTPRIO 调用 SOAP 服务,受 Windows 身份验证保护(托管在内部 IIS 服务器上)。 从 Delphi XE 到 Delphi 10.3,调用 web 服务的代码运行良好。在 Delphi 10.3 和 10.3.1 中,这不再有效。

从 10.3 开始,服务器作为身份验证过程的一部分发送的 401 被 THTTPRIO 处理为最终的 html 响应,作为发送凭据的邀请,因此引发异常(SOAP 期望内容是 xml,而不是 html) .

在 Delphi 10.3 发行说明中,我读到 SOAP 实现已更改,但我找不到任何细节。

我考虑过发布代码,但实际发布的是 Delphi 源代码的一部分,我不确定是否允许。

如果 uri 只能通过 Windows 身份验证访问,则可以通过调用任何 SOAP 服务来重现此问题。

有谁知道如何使用 Windows 身份验证从 Delpi 10.3 应用程序调用 SOAP 服务?

编辑:相同的 SOAP 测试客户端应用程序在使用 10.2.3 编译时可以工作,而在使用 10.3 编译时则不能。由于不同之处在于 Embarcadero 从 WinInet 迁移到 WinHTTP for SOAP,似乎 Delphi 的 System.Net.HttpClient.Win.pas 中没有实现集成安全性。

有人加过这个吗?

【问题讨论】:

  • 在 10.3 之前,它依赖于 WinInet(如果你使用 USE_INDY 指令,它依赖于 Indy)。现在,它依赖于新的 Delphi THTTPClient,而在 windows 上它依赖于 WinHTTP。你可以查看马可博客blog.marcocantu.com/blog/…
  • 检查了两个建议:一个涉及基本身份验证,一个涉及证书。不幸的是,没有 Windows 集成安全性。

标签: delphi soap windows-authentication


【解决方案1】:

这原来是一个 winhttp 问题,而不是 Delphi 问题。 Winhttp 没有将我的服务器识别为本地 Intranet,因此在收到 401 响应后没有发送凭据。

当然,我首先尝试让我的 W10 机器将服务器识别为本地 Intranet,方法是通过主机名调用 url,而不是通过 fqdn。我没有成功,我不知道为什么。

但是,添加带有值 WINHTTP_AUTOLOGON_SECURITY_LEVEL_LOW 的选项 WINHTTP_OPTION_AUTOLOGON_POLICY 就可以了。

不幸的是,TSOAPClient 使用的 Delphi 的 TWinHTTPClient 没有公开此选项,让我别无选择,只能使用 Delphi 源文件 System.Net.HttpClient.Win.pas 的修改版本。

【讨论】:

    【解决方案2】:

    解决方案,Ronald 通过设置 WINHTTP_OPTION_AUTOLOGON_POLICY 找到的,自 10.3.2 版本以来由 Delphi 自己提供。

    您必须将HTTPWebNode(或直接HTTPWebNode.HTTP)的“UseDefaultCredentials”设置为true才能设置此选项。

    更新到 10.3.2 后应该不再需要修补 System.Net.HttpClient.Win.pas

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多