6

J'ai un service WCF SOAP qui utilise l'authentification d'accès de base. SSL n'est pas utilisé - Je comprends les problèmes de sécurité ici. En utilisant l'application WCFTestClient, j'ai vérifié que le service fonctionne en codant temporairement dans le service un nom d'utilisateur et un mot de passe à utiliser lorsque l'en-tête Authorization n'est pas présent.Comment utiliser une référence de service avec une authentification de base Service SOAP WCF

J'essaie maintenant d'écrire une application de test qui transmet les informations d'identification via l'en-tête Authorization. J'ai ajouté une référence de service à mon service dans mon application de test, mais l'en-tête Authorization n'est pas présent dans la demande http. Le produit MyServiceClient classe utilise System.ServiceModel.ClientBase

Dans mon application test, je suis en train de les lettres de créance comme suit

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

J'ai aussi essayé comme suit

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

Le web.config de service est la suivante

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

Le test app.config est comme suit 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> 

Vous ne savez pas ce que je manque?

+0

pouvez-vous montrer l'exemple de xml qui doit être envoyé? –

+0

Je ne suis pas sûr de savoir comment cela pourrait aider car j'utilise l'authentification de base. WCF remet toute la sérialisation vers et depuis XML, je ne la génère jamais. Je peux essayer d'obtenir une décharge de WireShark si vous pensez que ti pourrait vous aider. –

+0

Est-ce que votre service ou vous essayez d'envoyer SOAP au service de quelqu'un d'autre? –

Répondre

1

Ceci est un bon point de départ, déplacez votre reliure et informations de point final à partir du fichier de configuration à votre 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"); 

puis

MyServiceClient client = new MyServiceClient(binding, endpont); 

Essayez ceci, et modifier la liaison entre vos besoins , en particulier "Sécurité".

+1

Le déplacement de la configuration ne devrait rien changer. Comment cela envoie-t-il les informations d'identification? – StingyJack

2

BasicHttpBinding ne semble pas avoir de propriété de sécurité dans WP8, je suis très frustré d'essayer d'accéder à une liste de points de partage sous WP8. Xamarin IOS/Android ce n'est pas un problème.

Questions connexes