服务器使用ADFS认证时如何实现Javasoap客户端?

How to implement Java soap client when server uses ADFS authentication?

我们正在 Java 中实现一个 soap 客户端(使用 cxf wsdl2java)。在以前的项目中,身份验证基于 WS-Security 或基本 HTTP 身份验证。这些都很容易在 SoapUI 中测试并在 java.

中实现

然而,这一次,服务器使用 Web 应用程序代理作为反向代理,并使用 ADFS(Active Directory 联合身份验证服务)进行身份验证。我不知道这意味着什么的细节,但是在浏览器中打开 wsdl 端点 URL 时发生的事情是我们被重定向到类似于办公室登录页面 https://login.microsoftonline.com/ 的登录页面在输入凭据之前手动单击帐户类型。

手动登录时,我们被重定向回 wsdl 端点,末尾附加了 ?authToken=xxx,我认为令牌持续 1 小时。我们曾尝试要求提供商使用更标准的身份验证,但目前这是我们唯一拥有的。我们如何处理这个问题?

当尝试从 SoapUI 发出测试请求时,我们只是得到登录页面的完整 html 代码作为响应。我看到 SoapUI 中有一个基于表单的身份验证选项,但它不起作用,因为登录页面有多个帐户类型和多个 username/password 字段。测试的解决方法是手动登录并使用 authToken。但是我们如何在 Java cxf 客户端中自动执行此操作?

在浏览器中连接到端点 url 时,这是 url 重定向到登录页面后的样子:

[url 到 adfs 服务器]/adfs/ls?version=1.0&action=signin&realm=urn%3AAppProxy%3Acom&appRealm=a10037ed-ca1e-e711-9436-00215a9b01ac&returnUrl=[wsdl 端点url]&client-request-id=13A5B5A6-B574-0000-6FBA-A51374B5D201

您不能使用 SOAP 通过登录屏幕对 ADFS 进行身份验证。这是因为 ADFS 仅支持 WS-Fed 或 SAML-P 或 OpenID Connect (ADFS 4.0)。

您可以使用 WS-Tust 来做到这一点。

WS-Fed 支持两个配置文件即。被动(浏览器登录屏幕)或主动(网络服务/WCF)。你需要使用后者。

ADFS 中有许多可用的活动配置文件端点。默认情况下并非全部启用,因此您可能需要启用它们。