C# 需要避免数字签名公共证书BinarySecurityElement被mtom编码

C# 需要避免数字签名公共证书BinarySecurityElement被mtom编码,c#,.net,wcf,ws-security,mtom,C#,.net,Wcf,Ws Security,Mtom,我面临着一个我似乎无法解决的问题。使用wcf和ws-security使用基于java的web服务。使用非mtom请求,公钥证书作为binarysecurityelement的一部分作为base64字符串发送。但是,相同的证书是针对mtom请求进行mtom编码的。有没有一种方法可以避免使用wcf,这样公钥证书就可以作为binarysecurityelement中的嵌入式base 64字符串发送,而不是作为soap请求信封下的多部分部分发送 这种情况发生在公钥证书是RSA(2048位)的情况下,对于

我面临着一个我似乎无法解决的问题。使用wcf和ws-security使用基于java的web服务。使用非mtom请求,公钥证书作为binarysecurityelement的一部分作为base64字符串发送。但是,相同的证书是针对mtom请求进行mtom编码的。有没有一种方法可以避免使用wcf,这样公钥证书就可以作为binarysecurityelement中的嵌入式base 64字符串发送,而不是作为soap请求信封下的多部分部分发送

这种情况发生在公钥证书是RSA(2048位)的情况下,对于公钥证书也可以正常工作:RSA(1024位)

因此,对于具有RSA 2048位公钥的证书,出现了如下情况:

<o:BinarySecurityToken u:Id="uuid-4d4ee765-5717-4d53-9ac9-99bddc07df6c-2" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">
        <xop:Include href="cid:http%3A%2F%2Ftempuri.org%2F1%2F632618206525089430" xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
      </o:BinarySecurityToken>

相反,我需要嵌入base64证书值,而不是xop:include元素。这对于具有RSA 1024位公钥的证书来说是正确的

我有一个定制的编码器来编写消息,但是我似乎找不到任何特定的方法来覆盖它,这将允许我修改请求中如何生成binarysecurity令牌。想法


不确定自定义编码器是否也有帮助,使用xmlwriter对文件调用消息对象上的writemessage。我可以看到binarysecuritytoken由base64字符串组成,我认为它是证书原始字节。可能是在消息被mtom优化之后?

我看不出一个简单的方法。您可以同时禁用MTOM,但它将优化二进制数据。它有一个我认为您无法配置的内部threashold(仅从特定大小将二进制数据移出消息是经济高效的)


如果您想尝试这种方法,那么您可能需要实现一个与MTOM编码器非常相似的代码(请查看reflector中的代码),甚至可以在内部调用它。您要替换的是XmlMtomWriter的实例化。在您自己的writer中,重写writeBase64()方法,以便在数据未通过threashold时将其委托给writeString。您可以通过将.Net置于源代码调试模式并将断点放置在正确的位置来对整个场景进行试运行。

是否有任何特定的大小设置可以设置,以便只有数据大小>阈值得到mtom编码?感谢您的回复。我想,我不是走脱粒路线,而是采用了一种不同的方法。我已经有一个从MessageEncoder继承的自定义编码器类。在这个类中,我重写了WriteMessage方法。在内部,该方法调用innerencoder writemessage方法,然后修改输出以用base64版本的证书原始字节替换xop:include(使用正则表达式替换xop:include部分),不确定这是否是一个优雅的解决方案,但似乎正在工作:)