Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 签名失败核心验证错误_C#_Wcf_C# 3.0_Ws Security_Wsse - Fatal编程技术网

C# 签名失败核心验证错误

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

我设计了一个WCF.net客户端,它向供应商发送SOAP请求。为了满足供应商的WS-security需求,我必须创建一个自定义SOAP头,并将带有自定义头的请求发送到供应商端的web服务。因此,我通过实现从MessageHeader派生的新类创建了一个自定义头(见下文)

因此,在创建自定义头类之后,我重写了IClientMessageInspector.BeforeSendRequest方法来截获传出请求并将自定义头添加到soap请求中。参见下面的代码

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