如何解决在 .NET Core 中使用安全标头调用 SOAP 端点
.net core- 使用 wss 安全标头调用soap 服务
在我的 .net 核心类库项目中,我添加了对 WCF 服务的引用(使用 wsdl 文件),现在我在连接服务下生成了引用类。 我可以使用 BasicHttpBinding 调用 WCF 服务,但问题是服务器还需要安全元素以及 SOAP 标头
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
<wsse:Security
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<ds:Signature Id="SIG-"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
</ds:SignedInfo>
<ds:SignatureValue>==gMg==</ds:SignatureValue>
<ds:KeyInfo Id="KI-">
</ds:KeyInfo>
</ds:Signature>
<wsu:Timestamp wsu:Id="TS-34A069E7A55FECD03D16098926271579">
</wsu:Timestamp>
</wsse:Security>
<wsa:Action>http://www.test.com/Namespace/test_action</wsa:Action>
<wsa:MessageID>uuid:XXX</wsa:MessageID>
</soapenv:Header>
</soapenv:Envelope>
所以基本上我希望 SOAP 消息将这种安全标记附加到标头。请参阅上面的示例 SOAP。
提前致谢:-)
解决方法
您可以通过构建我的自定义标头来实现:
public class SoapSecurityHeader : MessageHeader
{
......
}
然后我们将其添加到 BeforeSendReply 方法中的 SOAP 标头,如下所示:
public class MessageInspector : IClientMessageInspector
{
public void AfterReceiveReply(ref Message reply,object correlationState)
{
throw new NotImplementedException();
}
public object BeforeSendRequest(ref Message request,IClientChannel channel)
{
SoapSecurityHeader head = new SoapSecurityHeader();
request.Headers.Add(head);
}
}
最后,您需要将 MessageInspector 应用于服务。如果您无法将 MessageInspector 应用于该服务,您可以参考此link。
,所以问题是向 SOAP 请求添加安全标头。我发现,通过绑定中的配置,您也可以发送安全标头。您可能不需要任何额外的代码。
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="ClientBehavior">
<clientCredentials>
<clientCertificate findValue="<certificate thumbprint here >" storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint"/>
<serviceCertificate>
<authentication revocationMode="NoCheck"/>
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<customBinding>
<binding name="BasicHttpBinding_IExampleService">
<security
defaultAlgorithmSuite="Default"
requireDerivedKeys="false"
messageProtectionOrder="SignBeforeEncrypt"
requireSignatureConfirmation="false"
securityHeaderLayout="Lax"
messageSecurityVersion="WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10"
includeTimestamp="true"
>
<localClientSettings detectReplays="true" />
<localServiceSettings detectReplays="true" />
</security>
<textMessageEncoding messageVersion="Soap11" />
<httpTransport />
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="http://localhost:63454/ExampleService.svc"
binding="customBinding" bindingConfiguration="BasicHttpBinding_IExampleService"
contract="ServiceReference1.IExampleService" name="BasicHttpBinding_IExampleService" behaviorConfiguration="ClientBehavior" >
<identity>
<certificateReference findValue="<certificate thumbprint here >" storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint" />
</identity>
</endpoint>
</client>
</system.serviceModel>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。