Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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# 需要WCF客户端在编码器触摸消息之前执行签名行为_C#_Wcf_Ws Security - Fatal编程技术网

C# 需要WCF客户端在编码器触摸消息之前执行签名行为

C# 需要WCF客户端在编码器触摸消息之前执行签名行为,c#,wcf,ws-security,C#,Wcf,Ws Security,由于向IRS提交消息的一些非常具体的要求,我必须使用自定义编码来创建MTOM消息。问题是,在编码器完成处理后,消息不再是XML,因为它必须为附件创建边界和标题 这是非常有问题的,因为此自定义编码是在端点行为之前执行的,我已将其配置为使用X509证书对出站消息进行签名。配置如下: <behaviors> <endpointBehaviors> <behavior name="SigningBehavior"> <clientCred

由于向IRS提交消息的一些非常具体的要求,我必须使用自定义编码来创建MTOM消息。问题是,在编码器完成处理后,消息不再是XML,因为它必须为附件创建边界和标题

这是非常有问题的,因为此自定义编码是在端点行为之前执行的,我已将其配置为使用X509证书对出站消息进行签名。配置如下:

<behaviors>
  <endpointBehaviors>
    <behavior name="SigningBehavior">
      <clientCredentials>
        <clientCertificate findValue="serial goes here" x509FindType="FindBySerialNumber"
          storeLocation="CurrentUser" storeName="My" />
        <serviceCertificate>
          <defaultCertificate findValue="serial goes here" x509FindType="FindBySerialNumber"
          storeLocation="CurrentUser" storeName="My" />
          <authentication certificateValidationMode="PeerTrust"/>
        </serviceCertificate>
      </clientCredentials>
    </behavior>
  </endpointBehaviors>
</behaviors>


在执行自定义编码之前,是否有办法让WCF客户端签名并添加WS-security标头?

您应该向该博客作者咨询。他是WCF方面的专家


我还没有达到你的目的。工作包括MTOM。您是如何将有效负载添加为MTOM附件的?我使用的是mtomMessageEncoding messageVersion=“Soap11”。然后我意识到IRS需要GZip编码。

你应该向这个博主咨询一下。他是WCF方面的专家


我还没有达到你的目的。工作包括MTOM。您是如何将有效负载添加为MTOM附件的?我使用的是mtomMessageEncoding messageVersion=“Soap11”。然后我意识到IRS需要GZip编码。

哦,这不容易。我定制了gzipMessageEncoding,并使其引用Microsoft Austria的SOAP实现,并将附件作为innerMessageEncoding,而不是WCF内置的MTOM编码。这样我就提前知道附件和边界将使用什么id值,从而可以正确设置HTTP头(特别是内容类型头)。我发现,在消息进入WCF管道后,您不能在任何时候修改或添加HTTP头。因此,它们必须提前设置。下一条消息我将在SWA编码写入方法中详细介绍MTOM moreNow,这是我进行签名和其他操作的地方。当然,签约是最后一个。需要将内联附件BulkExchangeFile内容替换为xop:Include,并使用与MTOM附件id匹配的href属性。然后,在这之后,我进行x509签名,它返回到外部gzip编码,然后连接到IRS。在成功使用SignedXml类加载整个SOAP消息(引用3个头ID)并从中获得几乎有效的签名元素后,我现在被困在无效的WS头上。但它并没有按照IRS的要求使用SecurityTokenReference。相反,它在KeyInfo元素中使用了同样有效的(根据W3C)X509Data和X509Certificate元素。不幸的是,他的解决方案都不适用于我们,因为MTOM编码完全破坏了出站消息中XML文档的任何概念。因此,WCF中内置的X509签名实用程序在这种情况下是无用的。感谢提供详细信息。我想这就是你所说的实现。哦,这不容易。我定制了gzipMessageEncoding,并使其引用Microsoft Austria的SOAP实现,并将附件作为innerMessageEncoding,而不是WCF内置的MTOM编码。这样我就提前知道附件和边界将使用什么id值,从而可以正确设置HTTP头(特别是内容类型头)。我发现,在消息进入WCF管道后,您不能在任何时候修改或添加HTTP头。因此,它们必须提前设置。下一条消息我将在SWA编码写入方法中详细介绍MTOM moreNow,这是我进行签名和其他操作的地方。当然,签约是最后一个。需要将内联附件BulkExchangeFile内容替换为xop:Include,并使用与MTOM附件id匹配的href属性。然后,在这之后,我进行x509签名,它返回到外部gzip编码,然后连接到IRS。在成功使用SignedXml类加载整个SOAP消息(引用3个头ID)并从中获得几乎有效的签名元素后,我现在被困在无效的WS头上。但它并没有按照IRS的要求使用SecurityTokenReference。相反,它在KeyInfo元素中使用了同样有效的(根据W3C)X509Data和X509Certificate元素。不幸的是,他的解决方案都不适用于我们,因为MTOM编码完全破坏了出站消息中XML文档的任何概念。因此,WCF中内置的X509签名实用程序在这种情况下是无用的。感谢提供详细信息。我想这就是你所说的实现。