2016-03-18 58 views
5

Sto provando a connettermi a un host del servizio SOAP SSL da C# usando Service Reference. Questo è il mio messaggio di richiesta:Connetti a SSL SOAP Host tramite "Service Reference" e passa Security Header

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
    <s:Header> 
     <VsDebuggerCausalityData xmlns="http://schemas.microsoft.com/vstudio/diagnostics/servicemodelsink">uIDPo/zwMmtdsVhFsAVDkQbiV/4AAAAA1zXtnc72UEm+4tlKzvCxsvN6OC2prvRIljIX4XzHKEYACQAA</VsDebuggerCausalityData> 
     <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
      <u:Timestamp u:Id="_0"> 
       <u:Created>2016-03-18T12:45:27.558Z</u:Created> 
       <u:Expires>2016-03-18T12:50:27.558Z</u:Expires> 
      </u:Timestamp> 
      <o:UsernameToken u:Id="uuid-2c7986ba-eee5-4411-90a9-a02b625c55ff-1"> 
       <o:Username>MyUserName</o:Username> 
       <o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">MyPlainPassword</o:Password> 
      </o:UsernameToken> 
     </o:Security> 
    </s:Header> 
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
     <generateId xmlns="http://com.vedaadvantage/dp3/Enterprise/StandardTradeCreditCommercial/IndividualCommercialService"/> 
    </s:Body> 
</s:Envelope> 

Questo è il messaggio che il mio servizio invia all'host. Ma l'host ritorna come segue:

Il processore di sicurezza non è riuscito a trovare un'intestazione di sicurezza nel messaggio. Ciò potrebbe essere dovuto al fatto che il messaggio è un errore non protetto o perché esiste una corrispondenza non vincolante tra le parti comunicanti. Ciò può verificarsi se il servizio è configurato per la sicurezza e il client non sta utilizzando la sicurezza.

Questo è il mio file di configurazione:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 

    <system.serviceModel> 

    <bindings> 
     <customBinding> 
     <binding name="myBinding"> 
      <textMessageEncoding messageVersion="Soap11" /> 
      <security authenticationMode="UserNameOverTransport" 
        messageSecurityVersion="WSSecurity10WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10" > 
      </security> 

      <httpsTransport /> 
     </binding> 
     </customBinding> 
    </bindings> 
    <client> 
     <endpoint address="https://{URL}" 
     binding="customBinding" 
       bindingConfiguration="myBinding" 
     contract="ServiceReference2.MyService" 
       name="IndividualCommercialService" /> 
    </client> 
    </system.serviceModel> 
</configuration> 

Anche se quando mando lo stesso XML tramite SoapUI o altri metodi HTTP Post funziona benissimo.

ho anche estrarre e attaccato il certificato e user/pass, come di seguito:

private static X509Certificate2 DownloadSslCertificate(string strDNSEntry) 
     { 

      X509Certificate2 cert = null; 
      using (TcpClient client = new TcpClient()) 
      { 
       //ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;   
       client.Connect(strDNSEntry, 443); 

       SslStream ssl = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null); 
       try 
       { 
        ssl.AuthenticateAsClient(strDNSEntry); 
       } 
       catch (AuthenticationException e) 
       { 
        //log.Debug(e.Message); 
        ssl.Close(); 
        client.Close(); 
        return cert; 
       } 
       catch (Exception e) 
       { 
        //log.Debug(e.Message); 
        ssl.Close(); 
        client.Close(); 
        return cert; 
       } 
       cert = new X509Certificate2(ssl.RemoteCertificate); 
       ssl.Close(); 
       client.Close(); 
       return cert; 
      } 
     } 

     private static void Main(string[] args){ 
       var proxy = new MyService(); 

       var uri = proxy.Endpoint.Address.Uri; 
       var cer = DownloadSslCertificate(uri.DnsSafeHost); 

       EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity(cer.Subject.Replace("CN=", "")); 
       EndpointAddress address = new EndpointAddress(proxy.Endpoint.Address.Uri, identity); 

       proxy.Endpoint.Address = address; 

       proxy.ClientCredentials.UserName.UserName = "MyUserName"; 
       proxy.ClientCredentials.UserName.Password = "MyPlainPassword"; 
       proxy.ClientCredentials.ServiceCertificate.DefaultCertificate = cer; 

       proxy.HellowWorld(); 
      } 

Non sono sicuro se il metodo che sto ottenendo il certificato sia corretto o meno e anche il motivo per cui HTTP Post funziona, ma la mia Chiamata di riferimento al servizio no.

Grazie in anticipo per il vostro aiuto.

Acclamazioni

risposta

1

cercare di guardare dentro WSDL (servizio Bibliografia) per vedere i file nascosti prima selezionare Mostra tutti i file in Esplora soluzioni. You `ll se all'interno riferimento al servizio Reference.svcmap -> Reference.cs, e all'interno di questo file aggiungere ProtectionLevel = System.Net.Security.ProtectionLevel.Sign come illustrato di seguito

[System.ServiceModel.ServiceContractAttribute(Namespace = "http://www.your.url/Service/", ConfigurationName = "Service.Service", ProtectionLevel = System.Net.Security.ProtectionLevel.Sign)] 

che dovrebbe aiutare tu. Di solito è davvero una cattiva idea modificare il proxy autogenerato, ma sembra che sia l'unica opzione.

+0

Grazie Vladimir, metterò alla prova questo e tornerò da te. – Barsham

+0

Benvenuto, per favore informami sui risultati – Vladimir