通过 HTTP 标头验证 SOAP 调用

Posted

技术标签:

【中文标题】通过 HTTP 标头验证 SOAP 调用【英文标题】:Authenticating SOAP call via HTTP headers 【发布时间】:2021-12-24 02:41:41 【问题描述】:

我希望使用他们的 SOAP API 与第三方集成。我已经通过 SoapUI 成功测试了 SOAP 调用,现在我正尝试在我的 .NET 核心应用程序中做同样的事情。

我希望通过在调用中传递地址标头来使用基本身份验证。

我目前正在做以下事情:

string credential = "UserName" + ":" + "Password";
AddressHeader authAddressHeader = AddressHeader.CreateAddressHeader("Authorization", string.Empty, "Basic " + Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(credential)));
AddressHeader[] addressHeaders = new AddressHeader[]  authAddressHeader ;

EndpointAddress endpointAddress = new EndpointAddress(new Uri("https://dm-delta.metapack.com/dm/services/ConsignmentService"), addressHeaders); // passing in authentication  via address header

// instantiating 3rd party client service reference code generated via WCF and passing in endpoint with authentication
var client = new ConsignmentServiceClient(ConsignmentServiceClient.EndpointConfiguration.ConsignmentService, endpointAddress); 

当我尝试调用客户端方法时,我收到以下错误消息:

The HTTP request is unauthorized with client authentication scheme 'Anonymous'. 
The authentication header received from the server was 'Basic realm="default"'.

我在调试我的应用程序时比较了授权标头字符串,它与我在 SoapUI 中的 SOAP 请求的标头中的授权完全相同,所以不确定它为什么会抱怨?

这是我第一次尝试在 .NET 核心中集成 SOAP API,非常感谢任何有关我可能做错的帮助或建议。

提前致谢

【问题讨论】:

【参考方案1】:

也许你可以在config中设置安全模式:

<security mode="TransportCredentialOnly">
    <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
    <message clientCredentialType="UserName" algorithmSuite="default" />
</Security>

WCFTestClient The HTTP request is unauthorized with client authentication scheme 'Anonymous' Calling a SOAP service in .net Core

【讨论】:

以上是关于通过 HTTP 标头验证 SOAP 调用的主要内容,如果未能解决你的问题,请参考以下文章

通过 SOAP 服务向 JIRA 进行身份验证时安全密码存储

在现有 WCF SOAP 服务中添加 Http 标头不起作用

如何将 HTTP 标头添加到 SOAP 客户端

只需在 HTTP 标头中发送一个密钥即可对 REST 调用进行身份验证?

如何通过 HTTP 使用 Java(或 C#)中的摘要身份验证 HTTP 发送 SOAP 请求?

通过尝试从肥皂服务检索数据,HTTP 请求未经授权