6

Ho un servizio SOAP WCF che utilizza l'autenticazione di accesso di base. SSL non viene utilizzato - Capisco i problemi di sicurezza qui.Come utilizzare un riferimento di servizio con un'autenticazione di base Servizio SOAP WCF

Utilizzo dell'applicazione WCFTestClient Ho verificato che il servizio funziona temporaneamente codificando nel servizio un nome utente e una password da utilizzare quando l'intestazione Authorization non è presente.

Sto provando ora a scrivere un'applicazione di test che trasmette le credenziali tramite l'intestazione Authorization. Ho aggiunto un riferimento di servizio al mio servizio nella mia app di test, ma l'intestazione Authorization non è presente nella richiesta http. Il generato MyServiceClient classe utilizza System.ServiceModel.ClientBase

Nella mia prova app io pongo le credenziali come segue

MyServiceClient client = new MyServiceClient("BasicHttpBinding_MyService"); 
client.ClientCredentials.UserName.UserName = "WebServiceUsername"; 
client.ClientCredentials.UserName.Password = "WebServicepassword"; 

Ho anche provato la seguente

MyServiceClient client = new MyServiceClient(); 
ClientCredentials loginCredentials = new ClientCredentials(); 
loginCredentials.UserName.UserName = "WebServiceUsername"; 
loginCredentials.UserName.Password = "WebServicepassword"; 
client.Endpoint.Behaviors.Remove(client.Endpoint.Behaviors.Find<ClientCredentials>()); 
client.Endpoint.Behaviors.Add(loginCredentials); 

Il web.config del servizio è la seguente

<services> 
    <service name="MyService" behaviorConfiguration="MyBehavior" > 
    <endpoint contract="MyService" binding="basicHttpBinding" /> 
    <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" /> 
    </service> 
</services> 

Il test app.config è come follo ws

<configuration> 
    <system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpBinding_MyService"> 
      <security mode="TransportCredentialOnly"> 
      <transport clientCredentialType="Basic"/> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:55314/MyService.svc" 
     binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_MyService" 
     contract="MyService" name="BasicHttpBinding_MyService" /> 
    </client> 
    </system.serviceModel> 
</configuration> 

Qualche idea su cosa mi manca?

+0

puoi mostrare un xml campione che deve essere inviato? –

+0

Non sono sicuro di come ciò possa essere d'aiuto poiché utilizzo l'autenticazione di base. WCF sta trasmettendo tutta la serializzazione da e verso XML, non l'ho mai generata. Posso provare a ottenere una discarica da WireShark se pensi che ti possa aiutare. –

+0

È il tuo servizio o stai cercando di inviare SOAP al servizio di qualcun altro? –

risposta

1

Questo è un buon punto di partenza, spostare il vostro legame e informazioni endpoint da file di configurazione per la classe:

 protected BasicHttpBinding binding = new BasicHttpBinding() 
     { 
      Name = "Name your binding here", 
      CloseTimeout = new TimeSpan(0, 1, 0), 
      OpenTimeout = new TimeSpan(0, 1, 0), 
      ReceiveTimeout = new TimeSpan(0, 10, 0), 
      SendTimeout = new TimeSpan(0, 1, 0), 
      AllowCookies = false, 
      BypassProxyOnLocal = false, 
      HostNameComparisonMode = HostNameComparisonMode.StrongWildcard, 
      MaxBufferSize = 65536, 
      MaxBufferPoolSize = 524288, 
      MaxReceivedMessageSize = 65536, 
      MessageEncoding = WSMessageEncoding.Text, 
      TransferMode = TransferMode.Buffered, 
      UseDefaultWebProxy = true, 
      Security = new BasicHttpSecurity() 
      { 
      Mode = BasicHttpSecurityMode.Transport, 
      Message = new BasicHttpMessageSecurity() { AlgorithmSuite = SecurityAlgorithmSuite.Default, ClientCredentialType = BasicHttpMessageCredentialType.UserName}, 
      Transport = new HttpTransportSecurity() { ClientCredentialType = HttpClientCredentialType.Digest } 
      }, 
     }; 
     protected EndpointAddress endPoint = new EndpointAddress("http://localhost:55314/MyService.svc"); 

e poi

MyServiceClient client = new MyServiceClient(binding, endpont); 

Prova questa, e ottimizzare il legame nelle vostre esigenze , in particolare "Sicurezza".

+1

Lo spostamento della configurazione non dovrebbe cambiare nulla. In che modo questo invia effettivamente le credenziali? – StingyJack

2

BasicHttpBinding non sembra avere una proprietà di sicurezza in WP8, sono molto frustrato con il tentativo di accedere a un elenco di sharepoint sotto WP8. Xamarin IOS/Android non è un problema.

Problemi correlati