it-swarm.com.de

WCF gibt einen ungesicherten oder falsch gesicherten Fehler aus

Ich versuche, einen Remote-Svc-Webdienst in Anspruch zu nehmen. Ich habe die Proxy-Klasse mit svcutil.exe erstellt, und danach habe ich diese Klasse meiner Konsolenanwendung hinzugefügt, aber es wird ein Fehler angezeigt:

Ein nicht gesicherter Fehler oder ein falsch gesicherter Fehler wurde von der anderen Partei empfangen. Den Fehlercode und die Details finden Sie in der Ausnahme zu den inneren Fehlern. 

System.ServiceModel.FaultException: Beim Überprüfen der Sicherheit für die Nachricht ist ein Fehler aufgetreten

Ich habe die WCF-Seite nicht erstellt, es handelt sich um einen Remote-SVC. Bitte helfen.

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

Dies ist meine app.config-Datei. Ich gebe den Benutzernamen und das Passwort in meiner consoleApp.cs-Datei mit obj.ServiceCredentials.UserName.UserName="xxxxxx" und .Password="xxxXx" ein.

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

Dies ist ein sehr dunkler Fehler, den WCF-Dienste auslösen. Das Problem ist, dass WCF die Sicherheit der an den Dienst übergebenen Nachricht nicht überprüfen kann. 

Dies ist fast immer auf einen Serverzeitversatz zurückzuführen. Der Remote-Server und die Systemzeit des Clients müssen innerhalb von 10 Minuten liegen. Wenn dies nicht der Fall ist, schlägt die Sicherheitsüberprüfung fehl.

Ich rufe eloqua.com an und finde heraus, wie hoch die Serverzeit ist, und vergleiche diese mit der Serverzeit. 

128
Randolpho

Obwohl Ihr Problem mit einer der oben genannten Lösungen gelöst wurde, können Sie für andere auch eine andere Option verwenden.

Sie können diese Ausnahmebedingung auch erhalten, wenn falsche Anmeldeinformationen übergeben werden an einen Basisendpunkt (SOAP 1.1), der die Benutzernamen-Anmeldeinformationen verwendet. Zum Beispiel, wenn Sie 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 eine AccessDeniedException wirft, wenn ungültige Anmeldeinformationen durchgereicht werden. Ich persönlich finde die hier enthaltene Nachricht etwas irreführend (das hat mich aus diesem Grund zum ersten Mal ein paar Minuten gekostet), aber die zugrunde liegende Ursache war klar, als ich die WCF-Diagnoseprotokolldateien konsultierte.

21
Xcalibur

Sie haben offensichtlich ein Problem mit dem WCF-Sicherheitssubsystem. Welche Bindung verwendest du? Welche Authentifizierung? Verschlüsselung? Unterzeichnung? Müssen Sie Domänengrenzen überschreiten?

Ein wenig Glatze zeigt weiter, dass bei anderen Benutzern dieser Fehler auftritt, wenn die Uhren von Client und Server nicht mehr synchron sind (mehr als fünf Minuten), da einige Sicherheitsschemata auf synchronisierten Uhren basieren. 

12

Dasselbe Problem, mit dem ich konfrontiert bin, ist meine WinForms-Anwendung C # 4.0

Als ich die Lösung hier las, habe ich das Datum und die Uhrzeit des Client-Computers überprüft, aber das war richtig und die aktuelle Uhrzeit wurde angezeigt, aber ich war immer noch mit diesem Problem konfrontiert.

Nach einiger Umgehung fand ich heraus, dass die falsche Zeitzone ausgewählt wurde. Ich war in Indien und die Zeitzone war von Kanada. Der Host-Server befindet sich in Kuwait.

Ich habe festgestellt, dass das System die Zeit in die Weltzeit umwandelt.

Als ich die Zeitzone in Indiens Zeitzone umstellte, wurde das Problem gelöst.

5

Wenn Sie die Anmeldeinformationen des Benutzers (wie im folgenden Codeblock beschrieben) übergeben, sollte dies mit dem Benutzernamen/Kennwort auf dem Server übereinstimmen. Andernfalls erhalten Sie diese Fehlermeldung.

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

4
user2206393

Ändern Sie den Sicherheitsmodus in "Transport".

Sie haben keine Übereinstimmung zwischen dem Sicherheits-Tag und dem Transport-Tag.

3
Shiraz Bhaiji

In meinem Fall habe ich Zertifikate für die 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.

2
Milton Carranza

In meinem Fall begann ich zu arbeiten, als ich das wshttpbinding-Protokoll von https in http änderte.

2
chintan

Was es wert ist - ich hatte auch diesen Fehler und fand heraus, dass die Verbindungszeichenfolge in den web services web.config so eingestellt war, dass eine Verbindung zum falschen Computer hergestellt wurde.

2
Chris B

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

Nur zum Teilen ... Ich hatte einen seltenen Fall, der mich ein paar Minuten lang am Hinterkopf kratzte. Auch wenn die Zeitversatzlösung sehr genau war und ich dieses Problem bereits gelöst hatte, war dieses Mal etwas anderes. Ich war auf einer neuen Win8.1-Maschine, von der ich mich erinnere, dass sie eine Zeitzone hatte, und ich hatte die Uhrzeit manuell angepasst. Nun, ich bekam den Fehler immer wieder, obwohl die Zeit, die sowohl auf dem Server als auch auf dem Client angezeigt wurde, nur einen Unterschied in Sekunden hatte. Was ich getan habe, ist "Sommer-Spar-Option" zu aktivieren (beachten Sie, dass ich zwar unter Sommerzeit sparte, aber die Uhrzeit manuell eingestellt hatte). In "Datums- und Uhrzeit-Setup" ging ich dann zum Internet-Zeitabschnitt und erfrischte ... die Zeit in Mein PC blieb genau gleich, aber der Fehler verschwand.

Hoffe, das ist für jeden nützlich!

1
Jemil Marcos

Meistens tritt diese Ausnahmebedingung auf, wenn auf dem Server Fehler auftreten. Die häufigste ist eine falsche Konfiguration der Authentifizierungsdatenbank oder Authentifizierung. In meinem Fall gab es eine andere Uhrzeitsynchronisation. Stellen Sie sicher, dass sowohl Client als auch Server die gleichen Einstellungen haben 

Klicken Sie rechts unten auf Uhrzeit -> "Datumszeiteinstellungen ändern ..." -> Registerkarte "Internetzeit" -> Einstellungen ändern ... -> Aktivieren Sie die Option "Mit einem Internetzeitserver synchronisieren" nicht markiert -> Wählen Sie im Server-Dropdown-Menü "times.windows.com" -> Jetzt aktualisieren -> OK aus

1
Adeel Nazir

Ich hatte dieses Problem auch aus einer veralteten Servicereferenz, selbst wenn sich Server und Client auf demselben Computer befanden. Durch Ausführen des Update-Referenzhandbuchs wird das Problem normalerweise behoben.

1
Sam

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  

In meinem Fall gibt es zwei Probleme, die diese Ausnahme auslösen.

Beachten Sie, dass meine Umgebung Single Sign On (oder STS, wenn Sie möchten) zur Authentifizierung eines Benutzers über die ASP.NET-MVC-Site verwendet. Die MVC-Site ruft wiederum einen Service-Aufruf an meinen Service-Endpunkt auf, indem sie das Bearer-Token übergeben, das zuvor vom STS-Server mit dem Bootstrap-Token angefordert wurde. Der Fehler, den ich bekam, war, als ich einen Service-Anruf von der MVC-Site tätigte.

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

  2. Die Servicekonfiguration wurde nicht ordnungsgemäß konfiguriert. Insbesondere auf dem Knoten "speakerUris" von system.identityModel. Sie muss genau mit der Service-Endpunkt-URL übereinstimmen.

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

In meinem Fall war dies eine Einstellung im Anwendungspool IIS.

Wählen Sie den Anwendungspool aus -> Erweiterte Einstellungen -> Setzen Sie 'Enable 32 Bit Applications' auf True.

Dann recyceln Sie den Anwendungspool.

0
Stuart C

In meinem Fall war die Serverzeit nicht korrekt. Daher habe ich die Einstellungen für die Server-Datetime in "Uhrzeit automatisch einstellen" geändert und das Problem behoben.

0
Fahad Arshad

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

_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

Ich habe diesen Fehler erhalten, da BasicHttpBinding keine kompatible messageVersion an den Dienst sendet, den ich anrief. Meine Lösung bestand darin, eine benutzerdefinierte Bindung wie folgt 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>
0
Lukie

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

0
albertjan