2016-03-18 2 views
5

Ich versuche, eine Verbindung zu einem SSL-SOAP-Service-Host von C# mit Service-Referenz. Dies ist meine Anfrage Nachricht:Verbinden mit SSL-SOAP-Host über "Service-Referenz" und übergeben 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> 

Dies ist die Botschaft, die mein Dienst an den Host sendet. Aber der Host kehrt wie folgt zurück:

Der Sicherheitsprozessor konnte in der Nachricht keinen Sicherheitsheader finden. Dies kann daran liegen, dass es sich bei der Nachricht um einen ungesicherten Fehler handelt oder weil zwischen den kommunizierenden Parteien eine Bindungsabweichung besteht. Dies kann auftreten, wenn der Dienst für die Sicherheit konfiguriert ist und der Client keine Sicherheit verwendet.

Dies ist meine Config-Datei:

<?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> 

Obwohl, wenn ich die gleiche XML über SOAPUI oder andere HTTP Post senden Methoden funktioniert es gut.

ich auch extrahieren und an das Zertifikat und den Benutzer/wie unten passieren:

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(); 
      } 

Ich bin nicht sicher, ob die Methode, die ich das Zertifikat bin immer richtig ist oder nicht, und auch, warum HTTP Post funktioniert, aber mein Service Reference Call nicht.

Vielen Dank im Voraus für Ihre Hilfe.

Prost

Antwort

1

Try innerhalb WSDL (Service Referenzen) zu suchen, um versteckte Dateien zuerst wählen Alle Dateien anzeigen in dem Solution Explorer zu sehen. You `ll se innerhalb Dienstverweises Reference.svcmap -> Reference.cs, und innerhalb dieser Datei hinzufügen Protectionlevel = System.Net.Security.ProtectionLevel.Sign wie unten

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

, die helfen sollen, Sie. Normalerweise ist es eine schlechte Idee, automatisch generierten Proxy zu ändern, aber das scheint die einzige Option zu sein.

+0

Dank Vladimir, ich werde das testen und auf Sie zurückkommen. – Barsham

+0

Ihre Begrüßung, bitte informieren Sie mich über Ergebnisse – Vladimir

Verwandte Themen