78 votes

WCF:Une erreur non sécurisée ou incorrecte.

Bonjour à tous J'essaie de consommer un webservice svc distant. J'ai créé la classe proxy à l'aide de svcutil.exe et après avoir ajouté cette classe à mon application console, une erreur s'est produite.

Une erreur non sécurisée ou une erreur incorrecte erreur sécurisée a été reçue de l l'autre partie. Voir la faute interne exception pour le code d'erreur et le détail. System.ServiceModel.FaultException : Une erreur s'est produite lors de la vérification de la sécurité pour le message

S'il vous plaît aidez (je n'ai pas créé ce WCF, c'est un svc à distance) ! Merci d'avance.

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

Voici mon fichier app.config. Et je fournis le nom d'utilisateur et le mot de passe dans mon fichier consoleApp.cs obj.ServiceCredentials.UserName.UserName="xxxxxx" and .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>

0 votes

Cela se produit-il lors du premier accès au service ou après un certain temps ?

0 votes

C'est difficile à dire sans plus de détails, mais il semble que le service distant attende des informations d'identification ou une authentification qui ne sont pas fournies.

139voto

Randolpho Points 36512

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

Cela est presque toujours dû à un décalage horaire du serveur. L'heure du serveur distant et l'heure du système du client doivent se situer (généralement) à moins de 10 minutes l'une de l'autre. Si ce n'est pas le cas, la validation de la sécurité échoue.

J'appellerais eloqua.com pour savoir quel est le temps de leur serveur, et je le comparerais au vôtre.

2 votes

@user782534 vous pouvez définir le skew dans la configuration si vous utilisez un reliure personnalisée mais vous ne pouvez pas le faire avec les liaisons par défaut, pour autant que je sache. Je ne suis pas non plus au courant de la possibilité de désactiver complètement la vérification. Je penche pour le non sur ce point.

2 votes

J'appelle un service à distance qui me répond dans un délai de 9 heures plus long que le mien (en fait, c'est ce qui apparaît dans les journaux de SoapUI). L'en-tête de réponse contient ma date d'envoi mais sur les journaux de l'interface SOAP, je remarque que le temps de réponse est toujours 9 heures plus tard que le temps de ma demande. Comment cela est-il possible ? Même si je modifie mon heure locale. Merci à

0 votes

@DavutGürbüz c'est probablement dû au fait que l'heure du serveur est fausse. Si le client et le serveur semblent être réglés sur la même heure, je vérifierais le réglage du fuseau horaire sur l'un ou les deux ordinateurs - il est possible qu'ils pensent se trouver dans deux fuseaux horaires différents mais affichent la même heure.

26voto

Xcalibur Points 1312

Bien que votre problème ait été résolu avec l'une des solutions ci-dessus, pour le bénéfice des autres, vous obtenez également cette exception lorsque des informations d'identification incorrectes sont transmises à un point de terminaison de base (SOAP 1.1) qui utilise des informations d'identification de message de nom d'utilisateur comme vous. Par exemple, si vous appelez le service à partir du code et faites quelque chose comme ce qui suit :

var service = new TestService();

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

C'est différent d'un point de terminaison WSHTTP (SOAP 1.2) qui lève une exception AccessDeniedException lorsque des informations d'identification invalides sont transmises. Personnellement, je trouve le message contenu dans ce document un peu trompeur (il 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 une fois que j'ai consulté les journaux de traces de diagnostic WCF.

13voto

Daniel Brückner Points 36242

Vous avez manifestement un problème avec le sous-système de sécurité WCF. Quelle liaison utilisez-vous ? Quelle authentification ? Le cryptage ? Signature ? Devez-vous traverser des frontières de domaine ?

En cherchant un peu, on constate que d'autres personnes 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 la synchronisation des horloges.

0 votes

Merci pour la réponse!Veuillez vérifier mon fichier app.config et comment je me synchronise avec l'horloge du serveur ? Je n'ai que le lien .svc du serveur distant.

0 votes

Assurez-vous simplement que votre machine a réglé la date et l'heure correctes.

3 votes

Dans mon cas, le service et le client sont tous deux sur la même machine, mais je reçois toujours l'exception. Et cela se produit après un certain temps (par exemple 10 minutes) et le clientCredentialType est Windows.

4voto

user2206393 Points 31

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

Pour information, 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... :)

0 votes

Cela m'a aidé ! Le message d'erreur n'indiquait pas que je pouvais avoir envoyé les mauvaises informations d'identification, et je n'avais pas accès au code de service, donc j'étais à bout de souffle. J'ai vérifié deux fois et, bien sûr, j'envoyais le mauvais nom. Maintenant, je peux utiliser les méthodes du service avec succès.

10 votes

Est-ce que cela ne se résume pas à exactement la réponse de @Xcalibur (donné 2 ans plus tôt, avec exactement le même extrait de code) ?

4voto

Shiraz Bhaiji Points 34901

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

Il y a un décalage entre l'étiquette de sécurité et l'étiquette de transport.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X