2017-08-10 80 views
0

我在项目中添加了一个Java WSDL作为Web引用。我正在使用它来调用端点上的服务。我在ASMX文件中添加了一个WebMethod并在那里调用该服务。要求是使用WSE安全性并使用X509证书签署请求。从WSSE安全头中删除时间戳C#ASMX/WCF服务

不幸的是,时间戳是创造问题,我得到的回应“被发现的错误处理的头”。如果我从中删除TimeStamp元素,则相同的请求会从SoapUI中起作用。 This is how the request look like

这里是一个创建安全元素

//Set WSSE Security 
    svc.RequestSoapContext.Security.Timestamp.TtlInSeconds = 300; 
    svc.RequestSoapContext.Security.MustUnderstand = true; 
    svc.RequestSoapContext.Security.Tokens.Add(newtoken); 
    Microsoft.Web.Services3.Security.MessageSignature signature = new Microsoft.Web.Services3.Security.MessageSignature(newtoken); 
    signature.SignatureOptions = Microsoft.Web.Services3.Security.SignatureOptions.IncludeSoapBody;    
    svc.RequestSoapContext.Security.Elements.Add(signature); 

===============

使用WCF

的问题仍然存在代码即使我使用WCF来做。只要我添加IncludeTimestamp = false;该请求没有发送并将其设置为true可以创建请求。

这里是WCF码 -

 //Create Endpoint 
     EndpointAddress address = new EndpointAddress((istest == true ? CHORUS_UFB_EMMA : CHORUS_UFB_PROD)); 

     //Add Certificate to EndPoint Service 
     X509Certificate2 cert = new X509Certificate2(@"Certificate Path", "Password", X509KeyStorageFlags.PersistKeySet); 

     //Setup custom binding with HTTPS + Body Signing + Soap1.1 
     CustomBinding binding = new CustomBinding(); 

     //HTTPS Transport 
     HttpsTransportBindingElement transport = new HttpsTransportBindingElement(); 

     //Set Security Binding as Transport 
     TransportSecurityBindingElement tsec = SecurityBindingElement.CreateCertificateOverTransportBindingElement(MessageSecurityVersion.WSSecurity10WSTrust13WSSecureConvers‌​ation13WSSecurityPol‌​icy12BasicSecurityPr‌​ofile10); 
     tsec.EnableUnsecuredResponse = true; 
     tsec.AllowInsecureTransport = true; 
     tsec.SecurityHeaderLayout = SecurityHeaderLayout.Lax; 
     tsec.LocalServiceSettings.DetectReplays = false; 
     tsec.LocalClientSettings.DetectReplays = false; 
     tsec.IncludeTimestamp = false; 
     tsec.SetKeyDerivation(false); 
     tsec.EndpointSupportingTokenParameters.Signed.Add(new SecureConversationSecurityTokenParameters()); 

     //Setup for SOAP 11 and UTF8 Encoding 
     TextMessageEncodingBindingElement textMessageEncoding = new TextMessageEncodingBindingElement(MessageVersion.Soap11, Encoding.UTF8); 

     //Bind in order (Security layer, message layer, transport layer) 
     binding.Elements.Add(tsec); 
     binding.Elements.Add(textMessageEncoding); 
     binding.Elements.Add(transport); 

Here is the generated request using above code 任何帮助,在此,将不胜感激。

回答

0

这可能会通过你的客户和你在哪里调用服务托管Web服务器之间的时间差造成的。

仔细检查,如果两个服务器上的时间匹配,并且是同步的。时间可能需要在5分钟之内。