为什么签名自定义绑定不包含请求?

时间:2018-03-26 12:27:38

标签: c# .net wcf wcf-binding xml-signature

我想要实现的是支持签名标头的自定义绑定。

我通过以下步骤创建自定义绑定:

  1. 我创建了三个元素来设置自定义绑定: SecurityBindingElement,TextMessageEncodingElement,HttpsTransportBindingElement。

    private BindingElement CreateSecurityBindingElement()
    {
        SecurityBindingElement security = SecurityBindingElement.CreateCertificateOverTransportBindingElement();
        security.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10;
        security.SecurityHeaderLayout = SecurityHeaderLayout.LaxTimestampLast;
        security.DefaultAlgorithmSuite = SecurityAlgorithmSuite.Basic128Sha256Rsa15;
        X509SecurityTokenParameters X509Parameters = new X509SecurityTokenParameters();
        X509Parameters.InclusionMode = SecurityTokenInclusionMode.Once;
        X509Parameters.RequireDerivedKeys = false;
        X509Parameters.X509ReferenceStyle = X509KeyIdentifierClauseType.SubjectKeyIdentifier;
        security.EndpointSupportingTokenParameters.Signed.Add(X509Parameters);
        security.IncludeTimestamp = true;
        security.EnableUnsecuredResponse = true;
        return security;
    }
    
    private static BindingElement CreateTextMessageEncodingElement()
    {
        BindingElement encoding = new TextMessageEncodingBindingElement
        {
            MessageVersion = MessageVersion.Soap11WSAddressing10,
        };
        return encoding;
    }
    
    private BindingElement CreateTransportBindingElement()
    {
        BindingElement transport = new HttpsTransportBindingElement
        {
            RequireClientCertificate = true,
        };
        return transport;
    }
    
  2. 然后我按如下方式创建自定义绑定:

    private Binding CreateBinding()
    {
        BindingElement security = CreateSecurityBindingElement1();
        BindingElement encoding = CreateTextMessageEncodingElement();
        BindingElement transport = CreateTransportBindingElement();
        return new CustomBinding(
            encoding,
            security,
            transport
        );
    }
    
  3. 之后我创建了一个带有绑定

    的ChannelFactory
    public TResponse Send<TResponse>(Guid messageId, Func<TChannel, TResponse> send)
    {
        OperationContext context = new OperationContext((IContextChannel)Channel);
        using (OperationContextScope scope = new OperationContextScope(context))
        {
            var address = new EndpointAddress("http://www.w3.org/2005/08/addressing/anonymous?oin=00000001800866472000");
            context.OutgoingMessageHeaders.ReplyTo = address;
            context.OutgoingMessageHeaders.From = address;
            context.OutgoingMessageHeaders.MessageId = new UniqueId(messageId);
            return send(Channel);
        }
    }
    
  4. 当我尝试发送消息时,它以FaultException结束,消息'XPath expression // [local-name()='To'和namespace-uri()='http://www.w3.org/2005/08/addressing' ] | // [local-name()='From'和namespace-uri()='http://www.w3.org/2005/08/addressing'] | // [local-name()='Action'和namespace-uri()='http://www.w3.org/2005/08/addressing'] | // [local-name()='MessageID'和namespace-uri()='http://www.w3.org/2005/08/addressing'] | // * [local-name()='Body'和namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/']未被签名覆盖(来自客户)'

    我无法弄清楚邮件未签名的原因。任何人都可以帮助我吗?

0 个答案:

没有答案