C# 如何调用需要.Net核心签名的XML SOAP服务?

C# 如何调用需要.Net核心签名的XML SOAP服务?,c#,xml,soap,asp.net-core,wse,C#,Xml,Soap,Asp.net Core,Wse,我意识到这个问题指的是旧技术。我正在呼叫供应商系统,无法更改服务。我们需要调用XML/SOAPWS,然后对请求进行签名。10年前,我会使用Web服务增强(WSE)3.0之类的东西,然后继续前进。就在今天,我被困在.Net核心(.Net标准2.0)应用程序中 我愿意使用多种解决方案,包括商业解决方案。我看了看Chilkat,但似乎我们放弃了太多而无法使用它 然而,他们确实有一个很好的例子来说明我所指的 给出如下请求: <?xml version="1.0" encoding="UTF8"?&

我意识到这个问题指的是旧技术。我正在呼叫供应商系统,无法更改服务。我们需要调用XML/SOAPWS,然后对请求进行签名。10年前,我会使用Web服务增强(WSE)3.0之类的东西,然后继续前进。就在今天,我被困在.Net核心(.Net标准2.0)应用程序中

我愿意使用多种解决方案,包括商业解决方案。我看了看Chilkat,但似乎我们放弃了太多而无法使用它

然而,他们确实有一个很好的例子来说明我所指的

给出如下请求:

<?xml version="1.0" encoding="UTF8"?>
<SOAP-ENV:Envelope xmlns:SOAPENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
 <wsse:Security xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
            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"
            xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" SOAP-ENV:mustUnderstand="1">
 <wsse:BinarySecurityToken
           EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary"
           ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509"
           wsu:Id="x509cert00">BASE64_CERT</wsse:BinarySecurityToken>
 </wsse:Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="TheBody">
 <getVersion xmlns="http://msgsec.wssecfvt.ws.ibm.com"/>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

BASE64_证书
我们希望能够使用证书并像这样签名:

<?xml version="1.0" encoding="UTF8" ?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header>
        <wsse:Security xmlns:ds="http://www.w3.org/2000/09/xmldsig#" 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" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" SOAP-ENV:mustUnderstand="1">
            <wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509" wsu:Id="x509cert00">MIIDgzCCAmugAwIBAgIBADANBgkqhkiG9w0BAQUFADBcMRUwEwYDVQQDDAxUZXN0
IENvbXBhbnkxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYD
VQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwHhcNMTcwOTEzMDA1NTM1WhcN
MTgwOTEzMDA1NTM1WjBcMRUwEwYDVQQDDAxUZXN0IENvbXBhbnkxCzAJBgNVBAYT
AkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRn
aXRzIFB0eSBMdGQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDiWRKl
x+88u4SKZnfCMraqMsfJCs6tcz3EjMYTWmRKhhUOE9pDkvZfv0mgF7pNHsTKvFRt
oVnEVQaZC5TlHNOGa2QWit9YuruWjW8VSaU4s9gR1/Cg9/Zc8Z0yUEDpsaVnwuoA
RpVzvzoRzPmTNpMNEcQ07aBjHP7OJrwyvcdqQA1BbfDVMmRmw1d+/i8tyR3cTyzl
/3TismN5nrmhGh/ZF75FFA/xDN7PbVYDPowiFnEVHiBrYh2mFTabRUnb7K4oLx+d
1L5x3Az299F/HYZlBenXpJLtnCL3+HY6qsGXVbzKjlKNqbXsmlzVkChu093weN/q
UvWO2883cEiXmdqxAgMBAAGjUDBOMB0GA1UdDgQWBBRsMy2bxsCKYyUYtTYz/zZb
z7Le0zAfBgNVHSMEGDAWgBRsMy2bxsCKYyUYtTYz/zZbz7Le0zAMBgNVHRMEBTAD
AQH/MA0GCSqGSIb3DQEBBQUAA4IBAQBnFQ+Sc3s8y79DTsA7CvvAFeG/zvWQiu8y
UM5LO1QcWeQQj29GMThqrY21dNfkynl7mZUMEeXKvwwzweFCc2odiUPHxoV1G4FE
tzNaZ8Ap9jye78YQ8SB8NPQwC7ovecfSqNflT4NMAThSuxpGp8Ugf7a24LXozLzL
bCRvG9sLGyRneZbfU8B43ELRLCkjzWR32N7D2pmKk4CEMiW0ScphU1JEHaimneMa
TFc63hNzKpuj7+BGv4ZuvB1j/Mbmz53PGgFKnGQHPb2TIvMxyB+lML5vE0Bm8YWt
P8DNyx11CCCdBdMWfeta6MjmmqcV5/YEq92c5O2Ql94tWFNLR6wQ</wsse:BinarySecurityToken>
            <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
                <ds:SignedInfo>
                    <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                        <InclusiveNamespaces xmlns="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="wsse SOAP-ENV" />
                    </ds:CanonicalizationMethod>
                    <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />
                    <ds:Reference URI="#TheBody">
                        <ds:Transforms>
                            <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                        </ds:Transforms>
                        <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                        <ds:DigestValue>VhsSnaEAFsY0OYegKQh99v9csXg=</ds:DigestValue>
                    </ds:Reference>
                </ds:SignedInfo>
                <ds:SignatureValue>Ynp3H4rtzpXIh4TaVxkpEkS1bMCCu672aeCzUOzheNNfnpmLsCZz3+zQjMBbchPggCayC5ihpEdhRe3XvPXjPXXAgxDP4mic091QPmjHlmUcu8yqRKfxnPtD35nqaxDtCYw+jGIzj+ch094vA4RPCfY8JQnb1mpy1ZjjsMW8741CIh1epbsd/0bZt6tfINUQ37seg07yvLbCJZ/Zf+h8FlFryQk6lHTTeZl/GfQ9NlDBcShby3x8Hc1KwW++zFqEA7G783R9AYPYn3fWTOBhYk5gkgFc+HaPRLR/L0Bp7ZPbmOR/iZQ+HK4W672tTdN/R2GdN7/deV7QTp2DYK1Z8w==</ds:SignatureValue>
                <ds:KeyInfo>
                    <wsse:SecurityTokenReference>
                        <wsse:Reference URI="#x509cert00" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509" />
                    </wsse:SecurityTokenReference>
                </ds:KeyInfo>
            </ds:Signature>
        </wsse:Security>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="TheBody">
        <getVersion xmlns="http://msgsec.wssecfvt.ws.ibm.com" />
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

MIIDGZCCAMUGAWIBAGABADANGKQHKIG9W0BAQUFADBCMRUWEWYDVQQDDAXN0
IenVbXbHbNKXCzaJbGnVbaytakFvMRMweqyDvqQQiDapTb21llVn0yxrlmsewhyd
VQKDBHJBNRLCM5LDCBXAWRNAXRZIFB0ESBMDGQWHHCNMTCWOTEZMDA1NTM1WHCN
MTGwotezmda1NTM1WJBCMRUWEWYDVQDDAXZXN0IENVBxHBNKXCZAJBGNVBAYT
AKFVMRWEWEQYDVQQIDAPTB21LLVN0YXRLMSEWHWYDVQKDBHJBNRLCM5LDCBXAWRN
AXRZIFB0ESBMDGQWGGEIMA0GCSQGSIB3DQEBAQAA4IBDWAWGGEKAOIbaQDIWRKL
x+88U4SKZNFCMRAQMSFJCS6TCZ3EJMYTWMRKHHUOE9PDKVZFW0MGF7PNHSTKVFRT
oVnEVQaZC5TlHNOGa2QWit9YuruWjW8VSaU4s9gR1/Cg9/Zc8Z0yUEDpsaVnwuoA
RPVZVZORZPMTNPMNECQ07ABJHP7OJRWYVCDQQQA1BBFDVMRMW1D+/i8tyR3cTyzl
/3ISMN5NRMHGH/ZF75FFA/xDN7PbVYDPowiFnEVHiBrYh2mFTabRUnb7K4oLx+d
1L5x3Az299F/HYZlBenXpJLtnCL3+HY6qsGXVbzKjlKNqbXsmlzVkChu093weN/q
UVWO2883CEIXMDQXAGMBAAGJUDBOMB0GA1UDGQWBBRSMY2BXSCKYYUYTTYZ/zZb
z7Le0zAfBgNVHSMEGDAWgBRsMy2bxsCKYyUYtTYz/ZZBZ7LE0ZAMBGNVRMEBTAD
AQH/MA0GCSqGSIb3DQEBBQUAA4IBAQBnFQ+Sc3s8y79DTsA7CvvAFeG/zvWQiu8y
UM5LO1QCWEQJ29GMTHQRY21NFKYNL7MZUMEEXKVWWZWEFC2ODIUPHxOv1G4FE
tzNaZ8Ap9jye78YQ8SB8NPQwC7ovecfSqNflT4NMAThSuxpGp8Ugf7a24LXozLzL
BCRVG9SLGyrnezBFU8B43ELRLCKJZWR32N7D2PMKK4CEMIW0SCPHU1JEHAIMEMENMA
TFc63hNzKpuj7+BGv4ZuvB1j/Mbmz53PGgFKnGQHPb2TIvMxyB+lML5vE0Bm8YWt
P8DNYX11CCDBDMWFETA6MJMMQCV5/YEq92c5O2Ql94tWFNLR6wQ
VhsSnaEAFsY0OYegKQh99v9csXg=
3+ZQQBBGGGGGGGGGGGGGGGGGGGGGGGGGGGG5 3 XVVVXXXXXXXXGGGGGGXXXXXXXXXXXXXXXXXXXXGZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZN7/deV7QTp2DYK1Z8w==

我通过滚动我们自己的soap信封、签名并通过HttpClient传送解决了这个问题。NETCore中的WCF无法为我们解决第三方服务的各种问题

以下是代码,可以很容易地根据您的需求进行更改:

/。。。
私有静态HttpClient客户端=新HttpClient();//https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
// ...
Uri=新的Uri(“https://thirdparty.com/service.svc");
X509Certificate2 cert=//来自某个存储等
var信封=建筑信封(证书);
使用(HttpRequestMessage请求=新的HttpRequestMessage(HttpMethod.Post,uri))
{
request.Content=newstringcontent(信封,Encoding.UTF8,“application/soap+xml”);
使用(HttpResponseMessage response=Client.SendAsync(request.Result)
{
if(响应。IsSuccessStatusCode)
{
response.Content.ReadAsStringAsync().ContinueWith(任务=>
{
字符串thirdparty_信封=task.Result;
XElement thirdparty_root=XElement.Parse(thirdparty_信封);
//等
},TaskContinuationOptions。同步执行);
}
}
}
私有字符串构建信封(X509Certificate2证书)
{
字符串信封=空;
//注意-这里有很多关于我第三方的信息
string cert_id=string.Format(“uuid-{0}-1”,Guid.NewGuid().ToString());
使用(var stream=new MemoryStream())
{
编码utf8=新的utf8编码(错误);//忽略BOM
使用(var writer=newXMLTextWriter(流,utf8))
{
//时间戳
DateTime dt=DateTime.UtcNow;
字符串now=dt.ToString(“o”)。子字符串(0,23)+“Z”;
字符串plus5=dt.AddMinutes(5).ToString(“o”).子字符串(0,23)+“Z”;
//肥皂袋
// 
writer.WriteStartDocument();
writer.writeStarteElement(“s”、“信封”、”http://www.w3.org/2003/05/soap-envelope");
WriteAttributeString(“xmlns”,“a”,null,”http://www.w3.org/2005/08/addressing");
WriteAttributeString(“xmlns”,“u”,null,”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
writer.writeStarteElement(“s”,“Header”,null);
/////////////////
//内脏//
/////////////////
//http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue
writer.writeStarElement(“a”,“Action”,null);
WriteAttributeString(“s”,“mustUnderstand”,null,“1”);
writer.WriteString(“http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue");
writer.WriteEndElement();//操作
//urn:uuid:0cc426dd-35bf-4c8b-a737-7e2ae94bd44d
字符串msg_id=string.Format(“urn:uuid:{0}”,Guid.NewGuid().ToString());
writer.writeStarteElement(“a”,“MessageID”,null);
writer.WriteString(msg_id);
writer.WriteEndElement();//消息