WCF gibt einen ungesicherten oder falsch gesicherten Fehlerfehler aus

73

Ich versuche, einen Remote-SVC-Webdienst zu nutzen. Ich habe die Proxy-Klasse mit erstellt svcutil.exeund 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.configAkte. Ich gebe den Benutzernamen und das Passwort in meiner consoleApp.csDatei 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>
user179862
quelle
Geschieht dies beim ersten Zugriff auf den Dienst oder nach einiger Zeit?
Sharique
Ohne weitere Details ist es schwer zu sagen, aber es scheint, dass der Remotedienst Anmeldeinformationen oder Authentifizierungen erwartet, die nicht bereitgestellt werden.
jnoss

Antworten:

135

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.

Randolpho
quelle
2
@ user782534 Sie können den Versatz in der Konfiguration festlegen, wenn Sie eine benutzerdefinierte Bindung verwenden , aber soweit ich weiß, können Sie dies nicht mit den Standardbindungen tun. Ich bin mir auch nicht bewusst, dass die Prüfung vollständig deaktiviert werden kann. Ich neige mich zu Nein.
Randolpho
2
Ich rufe einen Remote-Dienst an, der mir innerhalb von 9 Stunden weiter antwortet als ich. (Tatsächlich scheint es in SoapUI-Protokollen so zu sein.) Dann habe ich diesen Fehler erhalten. Der Antwortheader enthält mein Sendedatum, aber in SOAP UI-Protokollen stelle ich fest, dass die Antwortzeit immer 9 Stunden weiter ist als meine Anforderungszeit. Wie könnte es sein? Sogar ich ändere meine lokale Datums- / Uhrzeitangabe. Vielen Dank
Davut Gürbüz
@ DavutGürbüz wahrscheinlich liegt es daran, dass die Zeit des Servers falsch ist. Wenn sowohl der Client als auch der Server auf dieselbe Zeit eingestellt zu sein scheinen, würde ich die Zeitzoneneinstellung auf einem oder beiden Computern überprüfen. Möglicherweise denken sie, dass sie sich in zwei verschiedenen Zeitzonen befinden, aber dieselbe Zeit anzeigen .
Randolpho
Mein Problem gelöst. Mein Client war 1 Minute (!!!) vom Server entfernt. Es scheint, als würde WCF eine nach einer großen Zeitlücke empfangene Nachricht als verdächtig betrachten.
Stephen Chung
3
@Randolpho ... hmmm ... In meinem Fall führe ich meinen WCF-Dienst, meinen Testserver und meinen Testclient auf demselben Computer aus, daher bin ich mir nicht sicher, wie dies in meinem Fall eine Serverzeit sein könnte schief ... Wenn Sie mir etwas anderes sagen könnten ... oder irgendetwas anderes, was ich tun könnte, um das zu beheben, wäre ich sehr dankbar!
Matthew Layton
24

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, AccessDeniedExceptionwenn 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.

Xcalibur
quelle
13

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.

Daniel Brückner
quelle
Vielen Dank für die Antwort! Bitte überprüfen Sie meine app.config-Datei und wie synchronisiere ich mit der Serveruhr? Ich habe nur die .svc-Verbindung des Remote-Servers.
user179862
Stellen Sie einfach sicher, dass Ihr Gerät das richtige Datum und die richtige Uhrzeit eingestellt hat.
Daniel Brückner
3
In meinem Fall befinden sich sowohl der Dienst als auch der Client auf demselben Computer, aber ich erhalte immer noch eine Ausnahme. und dies geschieht nach einiger Zeit (dh 10 Minuten) und clientCredentialType ist Windows
Sharique
5

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.

Haider Ali Wajihi
quelle
es scheint unwichtig, aber in der Tat kann es die einzige Lösung des Problems sein :) Details!
Muzzy B.
4

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 ... :)

user2206393
quelle
Es hat mir geholfen! Die Fehlermeldung zeigte nicht an, dass ich möglicherweise die falschen Anmeldeinformationen gesendet hatte, und ich hatte keinen Zugriff auf den Servicecode, also war ich am Ende meines Witzes. Ich habe es noch einmal überprüft und natürlich den falschen Namen gesendet. Jetzt kann ich erfolgreich Servicemethoden nutzen.
PlayerGurl89
6
Kommt es nicht auf genau die Antwort von @Xcalibur an (2 Jahre zuvor mit genau demselben Code-Snippet)?
Jeroen
3

Versuchen Sie, Ihren Sicherheitsmodus auf "Transport" zu ändern.

Sie haben eine Nichtübereinstimmung zwischen dem Sicherheitsetikett und dem Transportetikett.

Shiraz Bhaiji
quelle
3

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

Adeel Nazir
quelle
2

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.

Chris B.
quelle
Dies bedeutet, dass die Überprüfung des Benutzernamens fehlgeschlagen ist. Etwas, das Xcalibur in seinem [ans] ( stackoverflow.com/a/7280782/1977871 ) erwähnt hat
VivekDev
2

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.

Milton Carranza
quelle
Willkommen bei Stack Overflow! Es ist unklar, ob Sie eine Lösung für das Problem vorschlagen oder sagen, dass Sie das gleiche Problem haben. Wenn es sich um eine Lösung handelt, können Sie genau klären, wie die Lösung funktioniert?
SuperBiasedMan
3
@ SuperBiasedMan Ich denke, es ist eigentlich ziemlich klar. Er sagt "Ich habe ... benutzt" und "Ich hatte vergessen ...". Es ist verständlich, dass das Problem behoben wurde, als er sich an die Installation erinnerte, und daher schlägt er vor, dasselbe zu tun, was er getan hat, "das Client-Zertifikat im Windows Store zu installieren ... damit es vom Server akzeptiert wird".
Diego Jancic
1
Ich hatte das gleiche Problem (aber in meinem Fall habe ich das Zertifikat auf LocalMachine \ Personal installiert). Ich finde es auch klar, aber wenn Sie detailliertere Anweisungen wünschen, gehen Sie wie folgt vor: 1. Klicken Sie im Windows Explorer mit der rechten Maustaste auf die Zertifikatdatei und wählen Sie "Zertifikat installieren". 2. Wählen Sie „Local Machine“, und klicken Sie auf Weiter 3. Wählen Sie „Alle Zertifikate in folgendem Speicher speichern“ 4. Klicken Sie auf Durchsuchen 5. Wählen Sie die entsprechende Stelle (für mich war es persönlich) und drücken Sie OK 6. Drücken Sie auf Weiter, Fertig
Fábio Duque Silva
2

In meinem Fall hat es funktioniert , als ich das wshttpbindingProtokoll von httpsauf geändert habe http.

Chintan
quelle
1

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.

Sam
quelle
1

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.

  • Tushar G. Walavalkar
user605172
quelle
1

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!

Jemil Marcos
quelle
1

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.

Fahad Arshad
quelle
0

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.

  1. Der WCF-Dienst wurde in meinem SSO nicht als vertrauende Partei konfiguriert (oder STS, wenn Sie dies bevorzugen).

  2. 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>
    
stack247
quelle
0

Stellen Sie sicher, dass Ihre SendTimeoutnach dem Öffnen des Clients nicht abgelaufen ist.

Albertjan
quelle
0

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>
Lukie
quelle
0

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  
Omar Trinidad Chavez Mojarro
quelle
0

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

Ankit Jain
quelle
0

Ich musste den SecurityMode in Message (WSHttpBinding) ändern, bevor es funktionierte. dh

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

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.

Stuart C.
quelle