java - 从 Java 调用 .NET Web 服务(WSE 2/3,WS-Security)

标签 java .net axis2 ws-security wse

我需要从 Java 调用一个用 .NET 编写的 Web 服务。 Web 服务实现了 WS-Security 堆栈(WSE 2 或 WSE 3,从我掌握的信息中并不清楚)。

我从服务提供商那里收到的信息包括 WSDL、一个 policyCache.config 文件、一些示例 C# 代码和一个可以成功调用服务的示例应用程序。

这并不像听起来那么有用,因为我不清楚我应该如何使用这些信息来编写 Java 客户端。如果 Web 服务请求未根据策略签名,则它会被服务拒绝。我正在尝试使用 Apache Axis2,但找不到任何关于我应该如何使用 policyCahce.config 文件和 WSDL 来生成客户端的说明。

我在 Web 上找到了几个示例,但在所有情况下,示例的作者都可以控制服务和客户端,因此能够对双方进行调整以使其正常工作。我不在那个位置。

有人成功过吗?

最佳答案

WS-Security 规范通常不包含在 WSDL 中(从不在 WSE WSDL 中)。所以 wsdl2java 不知道这个服务甚至需要 WS-Security。 WSE WSDL 中不存在安全约束这一事实让我非常失望(WCF 将在 WSDL 中包含 WS-Trust 信息)。

在客户端,您需要使用 Rampart将必要的 WS-Security header 添加到您的传出客户端消息。由于 WSDL 没有报告哪些 WS-Security 设置是必需的,因此您最好询问服务提供者需要什么。 WS-Security 要求可能是简单的明文密码,也可能是 X509 证书,也可能是加密消息……Rampart 应该能够处理大多数这些场景。

Apache Rampart 通过将模块加入到您的axis2.xml 文件中来“打开”。您需要下载 Rampart 模块并将其放在 axis2 目录中的特定位置,然后修改 xml 文件。您还可以通过编程方式参与 Rampart(如果需要,请编辑您的原始问题,我将编辑此回复)。

根据您配置壁垒的方式(通过其他 XML 文件或以编程方式),它将拦截任何传出消息并向其中添加必要的 WS-Security 信息。我个人使用带有壁垒的axis2来调用WSE3服务,该服务使用UsernameToken以明文形式进行保护,效果很好。类似但更高级的场景也应该有效。在上面链接的网站上有更多关于如何设置和开始使用 Rampart 的详细信息。如果您对 Rampart 的细节或如何将 Rampart 与您的特定 WSE 设置一起使用有疑问,请编辑您的问题,我会尽力回答。

关于java - 从 Java 调用 .NET Web 服务(WSE 2/3,WS-Security),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16451/

相关文章:

web-services - 设置 SOAPAction HTTP header 时的 Axis2 问题

java - 记录axis2客户端请求和响应

java - 在类中初始化记录器的最佳方法是什么?

java - 将一类不同的项目导入到我的项目中

c# - 具有 .NET Standard 目标的 Azure 云服务经典版

c# - RavenDB:返回属性为空值的对象

java - 在 ServiceNow 中创建新记录的权限不足(基本身份验证不起作用)

java - IE 不接受来自 Tomcat servlet 过滤器的 cookie

java - TimeUnit 无法解析符号

c# - 如何在 C# 中的单个数组中添加不同类型的对象?