web-services - 使用 Soap 请求发送客户端证书和授权 header 的理想方式是什么

标签 web-services wcf ssl soap soa

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

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

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

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

我关注了this article在每个服务请求中包含授权 HTTP header 。它工作正常。

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

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

问题:

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

注意:授权 header 和客户端证书仅用于 SOA 网关的验证,它们不是 Web 服务所必需的。

感谢您的帮助。

最佳答案

关于Headers,你也可以实现IClientMessageInspector接口(interface),为每次调用添加一个header。 像这样:

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);

希望对您有所帮助。

关于web-services - 使用 Soap 请求发送客户端证书和授权 header 的理想方式是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38842200/

相关文章:

java - 从一个国家获取时区

c# - 最简单的 REST 服务不工作

c# - 实现 WCF IErrorHandler 仅用于日志记录

c# - 使用匿名类型列表填充 AutoCompleteBox

python - 在 Python2.7.9 的形式源安装后我得到 ssl.SSLError : [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl. c:581)

java - 使用 QName 的目的

android - 在 android 中使用 ksoap2 的 java.lang.ClassCastException

web-services - 如何在 swagger-go 中使用 golang echo web 框架?

android - 平板电脑无法在某些浏览器中下载 .apk 文件

sql-server - 如何从 SQL Server 通过 SSL 查询 LDAP