Delphi SOAP 客户端 Windows 自 Delphi 10.3 以来身份验证已损坏
Delphi SOAP Client Windows authentication broken since Delphi 10.3
我们的 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 实现已更改,但我找不到任何详细信息。
我考虑过 posting 代码,但实际 post 是 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.
中未实现集成安全性
有人添加过这个吗?
这原来是 winhttp 问题,而不是 Delphi 问题。 Winhttp 没有将我的服务器识别为本地 Intranet,因此在收到 401 响应后没有发送凭据。
当然,我首先尝试让我的 W10 机器将服务器识别为本地 Intranet,方法是通过主机名调用 url,而不是通过 fqdn。我没有成功,我不知道为什么。
但是,添加值为 WINHTTP_AUTOLOGON_SECURITY_LEVEL_LOW 的选项 WINHTTP_OPTION_AUTOLOGON_POLICY 就成功了。
不幸的是,这个选项没有被Delphi的TSOAPClient使用的TWinHTTPClient公开,让我别无选择,只能使用Delphi源文件System.Net.HttpClient.Win.pas的修改版本。
罗纳德通过设置WINHTTP_OPTION_AUTOLOGON_POLICY
找到的解决方案,自10.3.2版本以来由Delphi自己提供。
您必须将HTTPWebNode
(或直接HTTPWebNode.HTTP
)的“UseDefaultCredentials
”设置为true
才能设置此选项。
更新到 10.3.2 后不再需要修补 System.Net.HttpClient.Win.pas
。
我们的 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 实现已更改,但我找不到任何详细信息。
我考虑过 posting 代码,但实际 post 是 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.
中未实现集成安全性有人添加过这个吗?
这原来是 winhttp 问题,而不是 Delphi 问题。 Winhttp 没有将我的服务器识别为本地 Intranet,因此在收到 401 响应后没有发送凭据。
当然,我首先尝试让我的 W10 机器将服务器识别为本地 Intranet,方法是通过主机名调用 url,而不是通过 fqdn。我没有成功,我不知道为什么。
但是,添加值为 WINHTTP_AUTOLOGON_SECURITY_LEVEL_LOW 的选项 WINHTTP_OPTION_AUTOLOGON_POLICY 就成功了。
不幸的是,这个选项没有被Delphi的TSOAPClient使用的TWinHTTPClient公开,让我别无选择,只能使用Delphi源文件System.Net.HttpClient.Win.pas的修改版本。
罗纳德通过设置WINHTTP_OPTION_AUTOLOGON_POLICY
找到的解决方案,自10.3.2版本以来由Delphi自己提供。
您必须将HTTPWebNode
(或直接HTTPWebNode.HTTP
)的“UseDefaultCredentials
”设置为true
才能设置此选项。
更新到 10.3.2 后不再需要修补 System.Net.HttpClient.Win.pas
。