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>
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.
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.
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.
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.
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 ... :)
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.
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.
Dans mon cas, lorsque j'ai changé le protocole wshttpbinding
de https
à http
, cela a commencé à fonctionner.
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.
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".
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!
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
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.
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.
Le service WCF n'était pas configuré en tant que partie de confiance dans mon SSO (ou STS si vous préférez).
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>
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.
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.
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));
<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>
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>
Assurez-vous que votre SendTimeout
ne s'est pas écoulée après l'ouverture du client.