c# – 有没有像SOAP代理服务器这样的东西,还是我不得不自己滚动?

前端之家收集整理的这篇文章主要介绍了c# – 有没有像SOAP代理服务器这样的东西,还是我不得不自己滚动?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
免责声明:我已经尝试使用谷歌搜索可以做我想要的东西,但没有运气.我希望这里有人可以伸出援助之手.

背景

我有一个.NET类库,可以使用WSE 2.0库访问安全的Web服务. Web服务为中央数据库提供了一个前端(它实际上是跨越多个客户的数据共享网络的一部分),类库提供了一个围绕Web服务调用的简单包装,使其可以从传统的VB6应用程序访问.遗留应用程序使用类库来检索和发布Web服务的信息.目前,应用程序和类库DLL都安装在多个工作站的客户端.

问题

问题是我们正在访问的Web服务使用HTTPS,并且需要向Web服务提供有效的X509客户端证书才能访问它.由于我们的所有组件都存在于客户端计算机上,因此导致了部署问题.例如,我们必须在每台客户端计算机上下载并安装每用户证书,每个用户可能需要通过我们的应用程序访问Web服务.更重要的是,必须通过VPN(特别是OpenVPN)访问Web服务器本身,这意味着必须在每台客户端计算机上安装和配置VPN客户端.这是一个主要的痛苦(我们的一些客户有几十个工作站).

建议的解决方

建议的解决方案是将所有这些逻辑移动到客户站点上的中央服务器.在这种情况下,我们的遗留应用程序将与本地服务器通信,然后本地服务器将关闭并转发请求到真正的Web服务.此外,作为简化和集中部署工作的一部分,所有X509证书都将安装在服务器上,而不是安装在每台客户端计算机上.

到目前为止,我们已经提出了三个选择:

>找到一个现成的SOAP代理服务器,它可以接收传入的基于HTTP的SOAP请求,修改SOAP消息的Host头和路由相关部分(因此它们指向真实的Web服务器),打开SSL连接到真实的Web服务器,向服务器提供正确的客户端证书(基于用户名到证书的映射),转发修改的请求,读取响应,将其转换回明文,然后将其发送回客户端.
>手工编写代理服务器,完成我刚才提到的所有内容.
>想想完全不同的,希望更好的方法解决这个问题.

合理

尝试查找和/或编写SOAP代理服务器的基本原理是我们现有的.NET包装器库根本不需要修改.我们只需将它指向代理服务器而不是真正的Web服务端点,使用普通的HTTP连接而不是HTTPS.代理服务器将处理请求,修改它以便真正的Web服务接受它(例如更改SOAPAction头以使其正确),处理SSL /证书握手,并将原始响应数据发送回客户端.

然而,这对我来说听起来像是一个可怕的黑客.那么,我的选择在这里呢?

>我是否咬紧牙关并编写自己的HTTP / SSL / SOAP / X509识别代理服务器来完成所有这些工作?
>或者……是否有一个现成的解决方案,具有足够的可扩展API,我可以很容易地做到我想要的
>或者……我应该采取完全不同的方法吗?

我们试图解决的关键问题是(a)集中存储证书的位置以简化证书的安装和管理,以及(b)进行设置,以便与Web服务器的VPN连接仅发生在一台机器上,而不是需要每个客户都安装了VPN客户端软件.

请注意,我们不控制托管Web服务的Web服务器.

编辑:为了澄清,我已经在C#中实现了一个(相当糟糕的)代理服务器,它确实符合要求,但是对于我解决这个问题的整个方法,我觉得从根本上说是错误的.所以,最终,我正在寻找保证我在正确的轨道上,或者有用的建议告诉我,我正在以完全错误的方式解决这个问题,以及任何提示做得更好的方法(如果有的话,我怀疑有).

解决方法

Apache Camel完全符合该法案. Camel是一个轻量级框架,用于完成这种应用程序集成.我过去曾用它来做一些类似的http代理.

Camel使用非常富有表现力的DSL来定义端点之间的路由.在您的情况下,您希望站起一个服务器,该服务器对您客户站点上的所有客户端计算机都是可见的,并且您收到的任何请求都要通过https从“此端点”路由到“您的安全端点”.

您需要创建一个定义路径的简单类.它应该扩展RouteBuilder并覆盖configure方法

public class WebServiceProxy extends RouteBuilder
{
    public void configure()
    {
       from("jetty:http://0.0.0.0:8080/myServicePath")
                  .to("https://mysecureserver/myServicePath");
    }
}

将它添加到Camel上下文中,你会很高兴.

CamelContext context = new DefaultCamelContext();
context.addRoute(new WebServiceProxy());
context.start();

此路由将使用在所有本地接口上绑定到8080的jetty创建Web服务器.发送到/ myServicePath的任何请求都将直接路由到uri https:// mysecureserver / myServicePath定义的webservice.您可以使用简单的uris定义端点,而dsl和camel负责繁重的工作.

您可能需要在其中配置带有证书的密钥库,并使其可用于http组件.如果你在这里遇到麻烦,再次发帖;)

我已经阅读了http组件的驼峰文档以获取更多详细信息,检查项目的单元测试,因为它们充满了示例和最佳实践.

HTH.

仅供参考:要让http组件使用您的密钥库,您需要设置以下属性

System.setProperty("javax.net.ssl.trustStore","path/to/keystore");
System.setProperty("javax.net.ssl.trustStorePassword","keystore-password");

猜你在找的C#相关文章