8 Stimmen

WCF-Dienst SecurityNegotiationException

Ich führe einen einfachen Dienst auf meinem Server mit WCF aus; der Dienst wird in WebDev.WebServer.exe (lokal) gehostet.

Wenn ich den lokalen Dienst aufrufe, erhalte ich die folgende Ausnahme:

Unbehandelte Exception: System.ServiceModel.Security.SecurityNegotiationException: Der sichere Kanal kann nicht geöffnet werden, da die Sicherheitsverhandlung mit dem entfernten Endpunkt fehlgeschlagen ist. Dies kann auf eine fehlende oder falsch angegebene EndpointIdentity in der zum Erstellen des Kanals verwendeten EndpointAddress zurückzuführen sein. Bitte überprüfen Sie, ob die in der EndpointAddress angegebene oder implizierte EndpointIdentity den entfernten Endpunkt korrekt identifiziert. ---> System.ServiceModel.FaultException: Die Nachricht mit der Aktion ' http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue ' nicht verarbeitet werden beim Empfänger verarbeitet werden, da der ContractFilter beim EndpointDispatcher nicht übereinstimmt. Dies kann der Fall sein aufgrund entweder eine Vertragsfehlanpassung (nicht übereinstimmende Aktionen zwischen Sender und Empfänger) oder eine Bindungs-/Sicherheitsfehlanpassung zwischen dem Sender und dem Empfänger. Prüfen Sie, ob Sender und Empfänger denselben Vertrag und dieselbe Bindung haben (einschließlich Sicherheitsanforderungen, z. B. Message, Transport, None).

Hier sind meine beiden app.config-Dateien vom Client und vom Server. Die app.config vom Client habe ich mit dem svcutil-Tool erstellt, sie sollte also richtig sein:

Kunde

<client>
    <endpoint address="http://localhost:1634/UsuarioContexto.svc" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IUsuarioContexto"

        contract="CarWin.ServiceContracts.Interfaces.IUsuarioContexto" name="LOCAL_WSHttpBinding_IUsuarioContexto">

        <identity><dns value="localhost" /></identity>

    </endpoint>

</client>

<binding name="WSHttpBinding_IUsuarioContexto" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">

    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />

    <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />

    <security mode="Message">

        <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />

        <message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default" establishSecurityContext="true" />

    </security>

</binding>

Server

<services>
    <service behaviorConfiguration="UsuarioContextoBehavior" name="UserContext.Host.UsuarioContexto">

        <endpoint address="" binding="wsHttpBinding" bindingNamespace="http://CarWin" bindingConfiguration="wsHttpBinding_IUsuarioContexto"

                  contract="CarWin.ServiceContracts.Interfaces.IUsuarioContexto">

            <identity>

                <dns value="localhost" />

            </identity>

        </endpoint>

        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

    </service>

</services>

<bindings>

    <wsHttpBinding>

        <binding name="wsHttpBinding_IUsuarioContexto" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">

            <readerQuotas maxArrayLength="2147483647" maxStringContentLength="2147483647" maxBytesPerRead="2147483647" />

            <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" />

            <security mode="None">

                <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />

                <message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true" />

            </security>

        </binding>

    </wsHttpBinding>

</bindings>

<behaviors>

    <serviceBehaviors>

        <behavior name="UsuarioContextoBehavior">

            <serviceMetadata httpGetEnabled="true" />

            <serviceDebug includeExceptionDetailInFaults="true" />

        </behavior>

    </serviceBehaviors>

</behaviors>

12voto

Alhambra Eidos Punkte 1455

Das Problem war im Server, ich setzte mode="Message" und funktioniert gut. danke.

<security mode="None">  

<transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />  

<message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true" />  

</security>

4voto

Tyler Punkte 859

WCF ist sehr leistungsfähig, kann aber ein Konfigurationsalptraum sein. Hier sind einige mögliche Hinweise:

  • Aktivieren Sie die WCF-Trace-Protokolle, führen Sie Ihr Szenario erneut aus und überprüfen Sie die Protokolle mit SvcTraceViewer.exe
  • Finden Sie heraus, wie weit die Nachricht reicht...
    • d.h. formt der Client die Anfrage und sendet sie an den Server, der sie zurückweist (d.h. in den unteren WCF-Schichten, bevor Ihr eigener Dienstcode getroffen wird);
    • oder wird die Anfrage schon vorher gestoppt. Der Client hat die Anfrage noch nicht einmal gesendet.
  • http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue ist eine WS-Trust-Token-bezogene Nachricht, also wird etwas mit der Authentifizierung passieren
    • der Fehler impliziert, dass die Konfiguration nicht übereinstimmt, aber wenn man SvcUtil verwendet, sollten sie so ausgerichtet sein, wie Sie gesagt haben
  • Die Client-Bindung hat den Server unter " http://localhost:1634/UsuarioContexto.svc "
    • Ich sehe nicht, dass dieser Port in der Dienstkonfiguration angegeben ist... hört der Dienst auf diesem Port?
    • Wenn Sie einen Browser öffnen und auf diese URL zielen, erhalten Sie dann eine Standard-Service-Seite?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X