簡體   English   中英

如何添加變換算法(“envelope-signature”)

[英]How to add transform algorithm (“enveloped-signature”)

我一直在調用 soap 服務,該服務需要“封裝簽名”作為轉換算法。 我得到“xml-exc-c14n#”。 我正在使用自定義綁定為 WCF 請求初始化客戶端。

更新:在上面的示例中,我嘗試不使用消息檢查器。 所以我嘗試了兩種方法。 1.使用 WCF 調用但我無法將轉換算法更改為“包絡簽名”。 2. 我嘗試使用 Inspector 創建簽名的 XML 文檔並將其添加到請求消息中。 就像在這個例子中解釋的消息檢查器 - WCF 調用我在兩個都失敗了。

下面是我在沒有 Inspector 的情況下用於 WCF 調用的代碼

var b = new CustomBinding();
var sec = (AsymmetricSecurityBindingElement)SecurityBindingElement.CreateMutualCertificateBindingElement(MessageSecurityVersion.WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10);
sec.EndpointSupportingTokenParameters.Signed.Add(new UserNameSecurityTokenParameters());
sec.MessageSecurityVersion =
    MessageSecurityVersion.
    WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12;
sec.IncludeTimestamp = false;
sec.MessageProtectionOrder = System.ServiceModel.Security.MessageProtectionOrder.SignBeforeEncrypt;
sec.DefaultAlgorithmSuite = System.ServiceModel.Security.SecurityAlgorithmSuite.Basic256Sha256;
X509SecurityTokenParameters x509Params = new X509SecurityTokenParameters
{
    X509ReferenceStyle = X509KeyIdentifierClauseType.IssuerSerial,
    RequireDerivedKeys = false,
    InclusionMode = SecurityTokenInclusionMode.Once,
    ReferenceStyle = SecurityTokenReferenceStyle.Internal
};
((AsymmetricSecurityBindingElement)sec).InitiatorTokenParameters = x509Params;


b.Elements.Add(sec);
b.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8));
b.Elements.Add(new HttpsTransportBindingElement() { });

如果您有任何想法,請幫助我。

在客戶端,通過實現 IClientMessageInspector 接口來攔截 SOAP 消息。

 public class ClientMessageLogger : IClientMessageInspector
{
    public object AfterReceiveRequest(ref Message reply, object correlationState)
    {
        MessageHeader header = MessageHeader.CreateHeader("UserAgent", "http://User", "User1");
        reply.Headers.Add(header);
        return null;
    }

    public void BeforeSendRequest(ref Message request, IClientChannel channel)
    {
        MessageHeader header1 = MessageHeader.CreateHeader("Testreply", "http://Test", "Test");
        request.Headers.Add(header1);
    }
}
[AttributeUsage(AttributeTargets.Interface)]
public class CustomBehavior : Attribute, IContractBehavior
{
    public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    {
        return;
    }

    public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
        return;
    }
    public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
    {
        dispatchRuntime.MessageInspectors.Add(new CustomMessageInspector());
    }

    public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
    {
        return;
    }
}

然后,將 CustContractBehavior 功能應用於服務接口。

     [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
        [CustomBehavior]
     public interface IDemo

當客戶端向服務器發送請求時,會調用BeforeSendRequest,當客戶端收到服務器回復消息時,會調用AfterReceiveReply。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM