Ich versuche, einen Remote-SVC-Webdienst zu nutzen. Ich habe die Proxy-Klasse mit erstellt svcutil.exe
und danach diese Klasse zu meiner Konsolenanwendung hinzugefügt, aber es wird ein Fehler ausgegeben:
Ein ungesicherter Fehler oder ein falsch gesicherter Fehler wurde von der anderen Partei empfangen. In der inneren Fehlerausnahme finden Sie den Fehlercode und Einzelheiten.
System.ServiceModel.FaultException: Beim Überprüfen der Sicherheit für die Nachricht ist ein Fehler aufgetreten
Ich habe die WCF-Seite nicht erstellt, es ist ein Remote-SVC. Bitte helfen Sie.
<?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>
Das ist meine app.config
Akte. Ich gebe den Benutzernamen und das Passwort in meiner consoleApp.cs
Datei mit obj.ServiceCredentials.UserName.UserName="xxxxxx"
und an.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>
Antworten:
Dies ist ein sehr dunkler Fehler, den WCF-Dienste auslösen. Das Problem ist, dass WCF die Sicherheit der Nachricht, die an den Dienst übergeben wurde, nicht überprüfen kann.
Dies liegt fast immer an einem Server-Zeitversatz. Der Remote-Server und die Systemzeit des Clients müssen innerhalb von (normalerweise) 10 Minuten voneinander liegen. Ist dies nicht der Fall, schlägt die Sicherheitsüberprüfung fehl.
Ich würde eloqua.com anrufen und herausfinden, wie hoch die Serverzeit ist, und diese mit Ihrer Serverzeit vergleichen.
quelle
Obwohl Ihr Problem mit einer der oben genannten Lösungen zum Nutzen anderer gelöst wurde, ist hier eine weitere Option.
Sie können diese Ausnahme auch erhalten, wenn falsche Anmeldeinformationen an einen Basisendpunkt (SOAP 1.1) übergeben werden, der die Anmeldeinformationen für Benutzernamennachrichten wie Sie verwendet. Wenn Sie beispielsweise den Dienst über Code aufrufen und Folgendes tun:
var service = new TestService(); service.ClientCredentials.UserName.UserName = "InvalidUser"; service.ClientCredentials.UserName.Password = "InvalidPass";
Dies unterscheidet sich von einem WSHTTP-Endpunkt (SOAP 1.2), der auslöst,
AccessDeniedException
wenn ungültige Anmeldeinformationen übergeben werden. Ich persönlich finde die hierin enthaltene Nachricht etwas irreführend (es hat mich sicherlich ein paar Minuten gekostet, als ich sie aus diesem Grund zum ersten Mal gesehen habe), aber die zugrunde liegende Ursache war klar, als ich die WCF Diagnostic Trace Logs konsultierte.quelle
Sie haben offensichtlich ein Problem mit dem WCF-Sicherheitssubsystem. Welche Bindung verwenden Sie? Welche Authentifizierung? Verschlüsselung? Unterzeichnung? Müssen Sie Domaingrenzen überschreiten?
Ein bisschen Brillen zeigt weiter, dass bei anderen dieser Fehler auftritt, wenn die Uhren von Client und Server nicht synchron sind (mehr als etwa fünf Minuten), da einige Sicherheitsschemata auf synchronisierten Uhren beruhen.
quelle
Das gleiche Problem, mit dem ich konfrontiert bin, ist die WinForms-Anwendung C # 4.0
Als ich die Lösung hier las, überprüfte ich Datum und Uhrzeit des Client-Computers, aber das war richtig und die aktuelle Uhrzeit wurde angezeigt, aber ich war immer noch mit diesem Problem konfrontiert.
Nach einigen Umgehungen stellte ich fest, dass die falsche Zeitzone ausgewählt wurde. Ich bin in Indien und die Zeitzone war in Kanada. Der Host-Server befindet sich in Kuwait.
Ich fand heraus, dass das System Zeit in Weltzeit umwandelt.
Als ich die Zeitzone in Indiens Zeitzone änderte, wurde das Problem gelöst.
quelle
Wenn Sie Benutzeranmeldeinformationen vom Client übergeben (gemäß dem folgenden Codeblock), sollte diese mit dem Benutzernamen / Kennwort auf dem Server übereinstimmen. Andernfalls wird dieser Fehler angezeigt.
Zu Ihrer Information, in meinem Fall verwende ich "basicHTTPAuthentication" mit dem Sicherheitsmodus "TransportWithMessageCredential". Der WCF-Dienst wird in IIS auf https gehostet.
var service = new TestService(); service.ClientCredentials.UserName.UserName = "InvalidUser"; service.ClientCredentials.UserName.Password = "InvalidPass";
Hoffe das hilft jemandem ... :)
quelle
Versuchen Sie, Ihren Sicherheitsmodus auf "Transport" zu ändern.
Sie haben eine Nichtübereinstimmung zwischen dem Sicherheitsetikett und dem Transportetikett.
quelle
Meistens tritt diese Ausnahme auf, wenn auf dem Server einige Fehler vorliegen. Die häufigste ist eine falsche Konfiguration der Authentifizierungsdatenbank oder Authentifizierung. In meinem Fall gab es unterschiedliche Uhrensynchronisation. Stellen Sie sicher, dass sowohl Client als auch Server die gleichen Einstellungen haben
Klicken Sie rechts unten auf Zeit -> "Datums- und Uhrzeiteinstellungen ändern ..." -> Registerkarte "Internetzeit" -> Einstellungen ändern ... -> aktivieren Sie die Option "Mit einem Internet-Zeitserver synchronisieren" deaktiviert -> Wählen Sie in der Server-Dropdown-Liste "times.windows.com" -> Jetzt aktualisieren -> OK
quelle
Für das, was es wert ist - ich hatte auch diesen Fehler und stellte fest, dass er durch die Verbindungszeichenfolge in den Webdiensten web.config verursacht wurde, die so eingestellt war, dass eine Verbindung zum falschen Computer hergestellt wurde.
quelle
In meinem Fall habe ich Zertifikate zur Authentifizierung verwendet, wobei certificateValidationMode auf "PeerTrust" gesetzt war, und ich hatte vergessen, das Clientzertifikat im Windows Store (LocalMachine \ TrustedPeople) zu installieren, damit es vom Server akzeptiert wird.
quelle
In meinem Fall hat es funktioniert , als ich das
wshttpbinding
Protokoll vonhttps
auf geändert habehttp
.quelle
Ich hatte dieses Problem auch aufgrund einer veralteten Dienstreferenz, selbst wenn sich Server und Client auf demselben Computer befanden. Wenn Sie "Update Service Reference" ausführen, wird das Problem im Allgemeinen behoben, wenn dies das Problem ist.
quelle
In meinem Fall wurde dieser Fehler auf demselben Computer in meiner Test-Client-Server-Anwendung angezeigt. Dieses Problem wurde jedoch durch "Update Service Reference" behoben.
quelle
Nur um zu teilen ... Ich hatte einen seltenen Fall, bei dem ich mir ein paar Minuten lang den Hinterkopf kratzte. Obwohl die Zeitversatzlösung sehr genau war und ich dieses Problem schon einmal gelöst hatte, war diesmal etwas anderes. Ich war auf einem neuen Win8.1-Computer, an den ich mich erinnere, dass ich ein Zeitzonenproblem hatte, und ich hatte die Zeit manuell angepasst. Nun, ich bekam immer wieder den Fehler, obwohl die auf Server und Client angezeigte Zeit nur einen Unterschied in Sekunden hatte. Was ich getan habe, ist "Sommer-Speicheroption" zu aktivieren (beachten Sie, dass ich zwar unter Sommer-Speicherzeit bin, aber die Zeit manuell eingerichtet habe) in "Datum und Uhrzeit-Einrichtung", dann zum Internet-Zeitabschnitt zu gehen und zu aktualisieren ... die Zeit in Mein PC blieb genau gleich, aber der Fehler verschwand.
Hoffe das ist für jeden nützlich!
quelle
In meinem Fall war die Serverzeit nicht korrekt. Daher habe ich die Datetime-Einstellungen des Servers auf Zeit automatisch einstellen geändert und das Problem behoben.
quelle
In meinem Fall gibt es zwei Probleme, die diese Ausnahme auslösen.
Beachten Sie, dass meine Umgebung Single Sign On (oder STS, wenn Sie dies bevorzugen) verwendet, um einen Benutzer über die ASP.NET MVC-Site zu authentifizieren. Die MVC-Site führt wiederum einen Serviceabruf an meinen Service-Endpunkt durch, indem sie das Inhaber-Token übergibt, das sie zuvor vom STS-Server mit dem Bootstrap-Token angefordert hat. Der Fehler, den ich bekam, war, als ich einen Serviceabruf von der MVC-Site aus tätigte.
Der WCF-Dienst wurde in meinem SSO nicht als vertrauende Partei konfiguriert (oder STS, wenn Sie dies bevorzugen).
Die Konfiguration des Dienstes wurde nicht richtig konfiguriert. Besonders auf dem AudienceUris-Knoten von system.identityModel. Es muss genau mit der URL des Service-Endpunkts übereinstimmen.
<system.identityModel> <identityConfiguration> <audienceUris> <add value="https://localhost/IdpExample.YService/YService.svc" /> </audienceUris> .... </identityConfiguration> </system.identityModel>
quelle
Stellen Sie sicher, dass Ihre
SendTimeout
nach dem Öffnen des Clients nicht abgelaufen ist.quelle
Ich habe diesen Fehler erhalten, weil BasicHttpBinding keine kompatible messageVersion an den von mir aufgerufenen Dienst gesendet hat. Meine Lösung bestand darin, eine benutzerdefinierte Bindung wie unten zu verwenden
<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>
quelle
Versuchen Sie es damit:
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
quelle
<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>
quelle
Ich musste den SecurityMode in Message (WSHttpBinding) ändern, bevor es funktionierte. dh
_wcf = new ServiceRequestClient(new WSHttpBinding(SecurityMode.Message), new EndpointAddress(_wcfRequestServerAddress));
quelle
In meinem Fall war dies eine Einstellung im IIS-Anwendungspool.
Wählen Sie den Anwendungspool -> Erweiterte Einstellungen -> Setzen Sie '32-Bit-Anwendungen aktivieren' auf True.
Recyceln Sie dann den Anwendungspool.
quelle