web-dev-qa-db-fra.com

WCF génère une erreur de défaillance non sécurisée ou mal sécurisée

J'essaie de consommer un service Web svc à distance. J'ai créé la classe proxy en utilisant svcutil.exe, puis j'ai ajouté cette classe à mon application console, mais cela génère une erreur:

Une erreur non sécurisée ou une défaillance mal sécurisée a été reçue de l'autre partie. Voir l'exception de faute interne pour le code de faute et les détails. 

System.ServiceModel.FaultException: une erreur s'est produite lors de la vérification de la sécurité du message.

Je n'ai pas créé le côté WCF, c'est un svc distant. S'il vous plaît aider.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="EloquaDataTransferService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Mtom" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="TransportWithMessageCredential">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="https://secure.eloqua.com/API/1.2/DataTransferService.svc"
                binding="basicHttpBinding" bindingConfiguration="EloquaDataTransferService"
                contract="DataTransferService" name="EloquaDataTransferService" />
        </client>
    </system.serviceModel>
</configuration>

Ceci est mon fichier app.config. Je fournis le nom d'utilisateur et le mot de passe dans mon fichier consoleApp.cs en utilisant obj.ServiceCredentials.UserName.UserName="xxxxxx" et .Password="xxxXx"

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <system.serviceModel>
      <bindings>
         <basicHttpBinding>
            <binding name="EloquaDataTransferService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Mtom" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true">
               <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
               <security mode="TransportWithMessageCredential">
                  <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
                  <message clientCredentialType="UserName" algorithmSuite="Default" />
               </security>
            </binding>
         </basicHttpBinding>
      </bindings>
      <client>
         <endpoint address="https://secure.eloqua.com/API/1.2/DataTransferService.svc" binding="basicHttpBinding" bindingConfiguration="EloquaDataTransferService" contract="DataTransferService" name="EloquaDataTransferService" />
      </client>
   </system.serviceModel>
</configuration>
66
user179862

C'est une erreur très obscure que les services WCF jettent. Le problème est que WCF est incapable de vérifier la sécurité du message qui a été transmis au service. 

C'est presque toujours à cause d'un décalage horaire du serveur. Le serveur distant et l'heure système du client doivent être espacés de (généralement) 10 minutes. S'ils ne le sont pas, la validation de la sécurité échouera.

J'appellerais eloqua.com pour connaître l'heure du serveur et la comparer à celle de votre serveur. 

128
Randolpho

Bien que votre problème ait été résolu avec l'une des solutions ci-dessus, pour le bénéfice des autres, voici une autre option.

Vous pouvez également obtenir cette exception lorsque des informations d'identification incorrectes sont transmises à un noeud final de base (SOAP 1.1) qui utilise les informations d'identification du message nom d'utilisateur telles quelles. Par exemple, si vous appelez le service à partir de code et procédez comme suit:

var service = new TestService();

service.ClientCredentials.UserName.UserName = "InvalidUser";
service.ClientCredentials.UserName.Password = "InvalidPass";

Cela diffère d'un point de terminaison WSHTTP (SOAP 1.2) qui envoie une AccessDeniedException lorsque des informations d'identification non valides sont transmises. Personnellement, je trouve le message contenu dans le présent document un peu trompeur (cela m’a certainement coûté quelques minutes la première fois que je l’ai rencontré pour cette raison), mais la cause sous-jacente était claire après avoir consulté les journaux de suivi de diagnostic de la WCF.

21
Xcalibur

Vous avez évidemment un problème avec le sous-système de sécurité WCF. Quelle liaison utilisez-vous? Quelle authentification? Cryptage? Signer? Devez-vous franchir les limites de domaine?

Un peu déconcertant révèle en outre que d'autres rencontrent cette erreur si les horloges du client et du serveur ne sont pas synchronisées (plus de cinq minutes environ), car certains schémas de sécurité reposent sur des horloges synchronisées. 

12
Daniel Brückner

Même ce problème, je suis confronté à mon application cliente est l’application WinForms C # 4.0

Quand j'ai lu la solution ici, j'ai vérifié la date et l'heure de l'ordinateur client, mais c'était juste et l'heure courante montrait, mais je faisais toujours face à ces problèmes.

Après un certain travail, j’ai découvert que le mauvais fuseau horaire a été sélectionné. Je suis en Inde et le fuseau horaire est celui du Canada. Le serveur hôte est situé au Koweït.

J'ai trouvé que le système convertit le temps en temps universel.

Lorsque j'ai changé le fuseau horaire pour le fuseau horaire de l'Inde, le problème a été résolu.

5
Haider Ali Wajihi

Si vous transmettez les informations d'identification utilisateur du client (comme indiqué dans le bloc de code ci-dessous), elles doivent alors correspondre au nom d'utilisateur/mot de passe sur le serveur. sinon vous obtiendrez cette erreur.

Pour info, dans mon cas, j'utilise "basicHTTPAuthentication" avec le mode de sécurité "TransportWithMessageCredential". Et le service WCF est hébergé dans IIS sur https.

var service = new TestService();

service.ClientCredentials.UserName.UserName = "InvalidUser";
service.ClientCredentials.UserName.Password = "InvalidPass";

J'espère que cela aidera à quelqu'un ... :)

4
user2206393

Essayez de changer votre mode de sécurité en "transport".

Vous avez une incompatibilité entre l'étiquette de sécurité et l'étiquette de transport.

3
Shiraz Bhaiji

Dans mon cas, j’utilisais des certificats pour l’authentification avec certificateValidationMode défini sur "PeerTrust" et j’avais oublié d’installer le certificat client dans Windows Store (LocalMachine\TrustedPeople) pour le faire accepter par le serveur.

2
Milton Carranza

Dans mon cas, lorsque j'ai changé le protocole wshttpbinding de https à http, cela a commencé à fonctionner.

2
chintan

Pour ce que ça vaut - j'ai aussi eu cette erreur et j'ai trouvé que c'était causé par la chaîne de connexion dans les services Web web.config étant configurée pour se connecter à la mauvaise machine.

2
Chris B

Dans mon cas, je recevais cette erreur sur le même ordinateur, dans mon application client-serveur de test. Mais ce problème a été résolu par "Update Service Reference".

  • Tushar G. Walavalkar
1
user605172

Juste pour partager ... J'ai eu un cas rare qui m'a fait me gratter l'arrière de la tête pendant quelques minutes. Même si la solution temporelle était très précise et que le problème avait été résolu auparavant, cette fois-ci, c'était différent. J'étais sur une nouvelle machine Win8.1 dont je me souviens avoir un problème de fuseau horaire et j'avais ajusté l'heure manuellement. Eh bien, je continuais à avoir l'erreur, malgré le temps affiché sur le serveur et le client n'avait qu'une différence en quelques secondes. Ce que j'ai fait est d'activer "option de sauvegarde d'été" (notez que je suis effectivement sous la sauvegarde de l'heure d'été, mais que l'heure a été configurée manuellement) dans "configuration de la date et de l'heure", puis est passé dans la section des heures Internet et actualisé mon pc a gardé exactement la même chose, mais l'erreur a disparu.

J'espère que cela sera utile à tout le monde!

1
Jemil Marcos

Généralement, cette exception se produit lorsqu'il y a des erreurs sur le serveur, la plus courante étant une configuration incorrecte de la base de données d'authentification ou une authentification. Dans mon cas, la synchronisation de l'horloge était différente Assurez-vous que le client et le serveur ont les mêmes paramètres 

Cliquez sur Heure en bas à droite -> "Modifier les paramètres de date/heure ..." -> onglet "Heure Internet" -> Modifier les paramètres ... -> cochez l'option "Synchroniser avec un serveur de temps Internet". non coché -> dans la liste déroulante du serveur, sélectionnez "times.windows.com" -> Mettre à jour maintenant -> OK

1
Adeel Nazir

J'ai également eu ce problème avec une référence de service obsolète, même avec le serveur et le client sur le même ordinateur. L'exécution de 'Référence du service de mise à jour' résoudra généralement les problèmes si tel est le problème.

1
Sam

Essayez avec ceci:

catch (System.Reflection.TargetInvocationException e1)  
      String excType   
      excType = e1.InnerException.GetType().ToString()  
      choose case excType  
                case "System.ServiceModel.FaultException"  
                          System.ServiceModel.FaultException e2  
                          e2 = e1.InnerException  
                          System.ServiceModel.Channels.MessageFault fault  
                          fault = e2.CreateMessageFault()  
                          ls_message = "Class: uo_bcfeWS, Method: registraUnilateral ~r~n" + "Exception(1): " + fault.Reason.ToString()   
                          if (fault.HasDetail) then  
                                    System.Xml.XmlReader reader  
                                    reader = fault.GetReaderAtDetailContents()  
                                    ls_message += " " + reader.Value  
                                    do while reader.Read()  
                                              ls_message += reader.Value  
                                    loop  
                          end if  
                case "System.Text.DecoderFallbackException"  
                          System.Text.DecoderFallbackException e3  
                          e3 = e1.InnerException  
                          ls_message = "Class: uo_bcfeWS, Method: registraUnilateral ~r~n" + "Exception(1): " + e3.Message   
                case else  
                          ls_message = "Class: uo_bcfeWS, Method: registraUnilateral ~r~n" + "Exception(1): " + e1.Message  
      end choose  
      MessageBox ( "Error", ls_message )  
      //logError(ls_message)  
      return false  

Dans mon cas, il y a deux problèmes qui vont lancer cette exception.

Notez que mon environnement utilise Single Sign On (ou STS si vous préférez) pour authentifier un utilisateur via le site ASP.NET MVC. Le site MVC passe à son tour un appel de service à mon point de terminaison de service en transmettant le jeton de support demandé précédemment au serveur STS avec le jeton Bootstrap. L'erreur que j'ai eu était lorsque j'ai fait un appel de service à partir du site MVC.

  1. Le service WCF n'était pas configuré en tant que partie de confiance dans mon SSO (ou STS si vous préférez).

  2. La configuration du service n'a pas été configurée correctement. Particulièrement sur le noeud audienceUris de system.identityModel. Il doit correspondre exactement à l'URL du noeud final du service.

    <system.identityModel>
        <identityConfiguration>
            <audienceUris>
                <add value="https://localhost/IdpExample.YService/YService.svc" />
            </audienceUris>
            ....
        </identityConfiguration>
    </system.identityModel>
    
0
stack247

Dans mon cas, il s'agissait d'un paramètre du pool d'applications IIS.

Sélectionnez le pool d'applications -> Paramètres avancés -> Définissez 'Activer les applications 32 bits' sur True.

Recyclez ensuite le pool d'applications.

0
Stuart C

Dans mon cas, l'heure du serveur n'était pas correcte. J'ai donc modifié les paramètres de date/heure du serveur pour définir l'heure automatiquement et le problème a été résolu.

0
Fahad Arshad

Je devais changer le SecurityMode en Message (WSHttpBinding) avant que cela fonctionne. c'est à dire. 

_wcf = new ServiceRequestClient(new WSHttpBinding(SecurityMode.Message),                     
       new EndpointAddress(_wcfRequestServerAddress));
0
JarmoP

<wsHttpBinding>
        <binding name="ISG_Binding_Configuration" bypassProxyOnLocal="true" useDefaultWebProxy="false" hostNameComparisonMode="WeakWildcard" sendTimeout="00:30:00" receiveTimeout="00:30:00" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647">
          <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" />
          <security mode="None">
            <message establishSecurityContext="false" clientCredentialType="UserName"/>
          </security>
        </binding>
      </wsHttpBinding>

0
Ankit Jain

Je recevais cette erreur en raison de la BasicHttpBinding n'envoyant pas un message compatible Version au service que j'appelais. Ma solution consistait à utiliser une liaison personnalisée comme ci-dessous

 <bindings>
  <customBinding>
    <binding name="Soap11UserNameOverTransport" openTimeout="00:01:00" receiveTimeout="00:1:00" >
      <security authenticationMode="UserNameOverTransport">
      </security>          
      <textMessageEncoding messageVersion="Soap11WSAddressing10" writeEncoding="utf-8" />
      <httpsTransport></httpsTransport>
    </binding>
  </customBinding>      
</bindings>
0
Lukie

Assurez-vous que votre SendTimeout ne s'est pas écoulée après l'ouverture du client. 

0
albertjan