使用Soap请求发送客户端证书和Authorization标头的理想方法是什么

时间:2016-08-09 04:39:13

标签: web-services wcf ssl soap soa

我有这个调用Web服务的ASP.Net Web API应用程序。现在(开发环境)Web服务(SOAP)和我的ASP.net应用程序在内部网络中。在生产中,web api应用程序将在公共Internet中,SOAP服务将在内部网络中。

在生产中,我们使用CA SOA Gateway来验证每个服务调用并将请求重定向到内部Web服务。 Gateway应用程序使用HTTPS,内部Web服务使用HTTP。

CA SOA网关需要2因素身份验证,

  • 身份验证标头(OAuth基本授权)
  • 客户证书

我已跟随this article在每个服务请求中包含授权HTTP标头。它工作正常。

我使用wcf客户端配置(在web.config中)包含带有请求的客户端证书(< security mode=transport />)。

我想从物理位置而不是证书存储添加客户端证书。我按照this article附加了文件中的客户端证书,但它并不适用于我,因为我使用.Net 4.6.1并且我没有使用System.ServiceModel命名空间来使用DevAge.ServiceModel代码(来自给定的示例代码)。

问题:

  • 是否有更好的方法在每个服务请求中包含HTTP标头?
  • 有没有办法从文件而不是证书存储中包含客户端证书?

注意:Authorization标头和客户端证书仅用于验证Web服务不需要的SOA网关。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

关于标题,您还可以实现 IClientMessageInspector 界面,为每个调用添加标头。 像这样:

public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request,  System.ServiceModel.IClientChannel channel)
{
   request.Properties.Add(HttpRequestMessageProperty.Name, new HttpRequestMessageProperty { .... });

}

这里有一个类似的问题和好例子:How to add a custom HTTP header to every WCF call?

这是我用过的另一个很好的例子:Authentication using HTTP Authorization Header in WCF SOAP API

有关 IClientMessageInspector 的更多信息:MSDN

关于证书,您可以在实例化客户端端点时从路径添加证书,如下所示:

var endpointIdentity = EndpointIdentity.CreateX509CertificateIdentity(new X509Certificate2(@"c:\cert\mycertificate.pfx", "password"));
var endpoint = new EndpointAddress(new Uri("http://dns/service.svc"), endpointIdentity);

或添加到客户端,如下所示:

var client = new YourService("BasicHttpBinding_IServiceInterface");
            client.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2(@"c:\certifcate.pfx", "password", X509KeyStorageFlags.DefaultKeySet);

希望它有所帮助。