C# 签名失败核心验证错误
我设计了一个WCF.net客户端,它向供应商发送SOAP请求。为了满足供应商的WS-security需求,我必须创建一个自定义SOAP头,并将带有自定义头的请求发送到供应商端的web服务。因此,我通过实现从MessageHeader派生的新类创建了一个自定义头(见下文) 因此,在创建自定义头类之后,我重写了IClientMessageInspector.BeforeSendRequest方法来截获传出请求并将自定义头添加到soap请求中。参见下面的代码C# 签名失败核心验证错误,c#,wcf,c#-3.0,ws-security,wsse,C#,Wcf,C# 3.0,Ws Security,Wsse,我设计了一个WCF.net客户端,它向供应商发送SOAP请求。为了满足供应商的WS-security需求,我必须创建一个自定义SOAP头,并将带有自定义头的请求发送到供应商端的web服务。因此,我通过实现从MessageHeader派生的新类创建了一个自定义头(见下文) 因此,在创建自定义头类之后,我重写了IClientMessageInspector.BeforeSendRequest方法来截获传出请求并将自定义头添加到soap请求中。参见下面的代码 object IClientMes
object IClientMessageInspector.BeforeSendRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel)
{
request.Headers.RemoveAt(0);
SignOnlyMessageHeader header = new SignOnlyMessageHeader("x509user", env);
request.Headers.Add(header);
return null;
}
最终结果是我截获了SOAP请求,并正确地用自定义头替换了当前头。在发出请求之前,我检查了更新的SOAP请求(放置了一个断点),该结构与供应商请求的完全匹配。但在供应商端处理请求后,我收到一个错误。它只说“签名未通过核心验证”。我认为我用“SignXmlFile”方法对整个信封进行了正确的签名。我甚至检查了方法中的有效性(如果(!signedXml.CheckSignature(new X509Certificate2(certificatePath,“changeit”),true)),则语句返回一个false,表示签名有效
我做错了什么?好吧,我试了又试,我截取报头的方式以及在我将签名注入报头之后……验证失败了。作为一种解决方法,我从.net客户机中剥离了整个标题。我只使用soapbaod将请求路由到XML网关,我们将网关配置为拦截请求并添加必要的头init,然后将请求转发给外部供应商。它成功了。你能用Fiddler或Wireshark准确地查看你的应用程序到底发送了什么吗?你确定你必须忽略空格吗?不管有没有空格,我都会遇到同样的错误。
object IClientMessageInspector.BeforeSendRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel)
{
request.Headers.RemoveAt(0);
SignOnlyMessageHeader header = new SignOnlyMessageHeader("x509user", env);
request.Headers.Add(header);
return null;
}