it-swarm.com.de

"Ungültiges oder abgelaufenes Sicherheitskontext-Token" bei Ausführung nach einem Debug-Neustart

Ich habe eine WCF-App, die ich codiere. Ich starte und beende es mehrmals, während ich Dinge ändere, und führe dann den Serviceabruf erneut aus.

Da ich Sitzungsinformationen benötige, verwende ich wsHttpBinding.

Bevor ich zu wsHttpBinding gewechselt bin, habe ich basicHttpBinding verwendet und konnte den Dienst beenden, Änderungen vornehmen und neu starten. Dann könnte ich meinen WCF-Testclient (WCF Storm) auf dem Endpunkt ausführen, und er würde weiterhin einwandfrei funktionieren.

Jetzt sagt es mir:

Die Nachricht konnte nicht verarbeitet werden. Dies ist höchstwahrscheinlich darauf zurückzuführen, dass die Aktion ' http://tempuri.org/IMyService/MyOperation ' nicht korrekt ist oder die Nachricht ein ungültiges oder abgelaufenes Sicherheitskontext-Token enthält oder eine Nichtübereinstimmung vorliegt zwischen den Bindungen. Das Sicherheitskontext-Token wäre ungültig, wenn der Dienst den Kanal aufgrund von Inaktivität abbrechen würde. Erhöhen Sie das Zeitlimit für den Empfang auf der Bindung des Dienstendpunkts, um zu verhindern, dass der Dienst inaktive Sitzungen vorzeitig abbricht.

Dies bedeutet, dass ich meine Verbindung aktualisieren und meinen Serviceabruf neu einrichten muss (was nach mehreren hundert Malen ärgerlich wird.).

Ich habe gelesen, dass das Sicherheits-Timeout 10 Minuten beträgt. Ich bin in weniger als 2 Minuten wieder am Laufen, also denke ich nicht, dass es ein Timeout-Problem ist.

Ich vermute, dass das Token aus dem offensichtlichen Grund verfällt, dass ich den Dienst beendet und neu gestartet habe.

Die Sache ist, dass Ich brauche das Sicherheitsmaterial überhaupt nicht (Ich brauche nur das Sitzungsmaterial oder ich würde BasicHttpBinding verwenden

Ist es trotzdem möglich, dass sich mein WCF-Dienst nicht um Sicherheitskontext-Tokens kümmert?

Hinweis: Mein Testclient ist standardmäßig wsHttpBinding und hat Sicherheitseinstellungen. Ich gehe jedoch davon aus, dass dies festgelegt wird, da mein Dienst für die Veröffentlichung Sicherheit benötigt.

Dinge, die ich versucht habe:

  • Ich habe eine Konfiguration ähnlich der gefundenen ausprobiert hier

    <bindings>
        <wsHttpBinding>
            <binding name="WsEventLogBinding">
                <security mode="Message">
                    <message establishSecurityContext="false" />
                </security>
             </binding>
        </wsHttpBinding>
    </bindings>
    

Aber ich weiß nicht genau, was das bedeutet oder ob es das ist, was ich brauche (was (fürs Erste) überhaupt keine Sicherheit ist).

Das Problem wurde dadurch nicht behoben.

  • <security mode="None"> einstellen Das hat nicht geholfen.
11
Vaccano

Zunächst sind Sie der Meinung, dass basicHttpBinding dies nicht unterstützt, da das HTTP-Protokoll verbindungslos/zustandslos ist.

Aber ich denke, dass etwas in Ihrem WCF-Verständnis nicht stimmt.

Sitzung ist ein allgemeines Konzept in WCF. Es kann sich um eine sicherheitsbasierte Sitzung handeln, bei der beide Kommunikationsenden eine bestimmte sichere Konversation vereinbart haben, oder um eine realisierbare Sitzung , bei der Nachrichten so konfiguriert werden können, dass sie in der richtigen Reihenfolge und genau zugestellt werden einmal, um sicherzustellen, dass Nachrichten auch dann empfangen werden, wenn sie während der Konversation über mehrere Knoten gesendet werden.

In beiden Modi können Sie InstanceContextMode.PerSession auswählen. Willst du das wirklich?

Die WCF-Sicherheit beruht auf gegenseitiger Authentifizierung. Wenn beide Parteien den Anmeldeinformationen des anderen vertrauen (basierend auf Ansprüchen), kann ein sicherer Kontext eingerichtet werden, in dem alle Nachrichten vertraulich ausgetauscht und alle Nachrichten zum Schutz ihrer Integrität signiert werden. Die Sicherheitssitzung ist einzigartig und Sie können sie nicht in einer anderen Konversation wiederverwenden.

Hier ist das Problem mit Ihrem Kontext: Das Problem liegt nicht auf Serverseite , sondern auf Clientseite . Da etwas auf dem Client und im Dienst beibehalten werden muss, wird beim erneuten Erstellen des Dienstes der gesamte WCF-Kontext auf dem Dienst gelöscht (alle Instanzen und Sitzungen werden gelöscht). Es gibt keinen allgemeinen Datenspeicher für WCF-Sitzungen (ein Unterschied zu asp. net session), so dass ein Neustart alles fallen lässt. Der Client glaubt jedoch weiterhin, aufgrund seines "ungültigen" Kontexts authentifiziert zu sein.

Um dies zu beheben, gibt es ein Kontrollkästchen für dieses Szenario auf dem Standard-Wcf-Test-Client: "Neuen Proxy starten". Auf WCf Storm gibt es eine allgemeine Konfiguration in Under the hood/Miscellaneous "Immer neuen Proxy erstellen".

Hinweis: In der Produktion haben Sie dieses Szenario nie, da Ihr Service immer verfügbar ist.

Wenn Sie mir folgen, möchten Sie vielleicht eine zuverlässige Sitzung versuchen. Sie können testen, aber ich bin mir nicht sicher, ob dies funktionieren wird.

<wsHttpBinding>
    <binding name="wsHttpBindingConfiguration">
        <security mode="None" />
        <reliableSession enabled="true" />
    </binding>
</wsHttpBinding>

Wichtiger Hinweis : Ich kenne Ihre WCF-Ebene nicht, aber in WCF müssen Clients und Dienste synchronisierte Konfigurationen haben (gleiche Sicherheit, Sitzungseinstellungen, ...)

11
Cybermaxs

bei wsHttpBinding ist die Sicherheit standardmäßig aktiviert . Versuchen Sie, dies in Ihrer Bindungskonfiguration zu verwenden, um die Sicherheit zu deaktivieren:

<security mode="None">
   <transport clientCredentialType="None" />
    <message establishSecurityContext="false" />
</security>

Außerdem hängt Ihr Fehler mit wsHttpBinding zusammen. Wenn Sie Sitzungen verwenden und den Server neu starten, wird die Meldung Gemeldeter Sicherheitsfehler angezeigt .

Laut MSDN :

Eine zuverlässige Sitzung implementiert das WS-ReliableMessaging-Protokoll und ein speicherinternes Übertragungsfenster, um SOAP Fehler auf Nachrichtenebene zu maskieren und Verbindungen bei Transportfehlern wiederherzustellen.

und

Die zuverlässige Sitzung besteht zwischen den Endpunkten von Sender und Empfänger SOAP, unabhängig von der Anzahl der Transportverbindungen, die für die Konnektivität zwischen ihnen erforderlich sind. Kurz gesagt, TCP Zuverlässigkeit endet dort, wo die Transportverbindung endet, während eine zuverlässige Sitzung Ende-zu-Ende-Zuverlässigkeit bietet.

Klingt nach dem erwarteten Verhalten.

4
lstern

Sicherheitsmodus Niemand sollte den Job machen.

<bindings>
    <wsHttpBinding>
        <binding name="WsEventLogBinding">
            <security mode="None" />
         </binding>
    </wsHttpBinding>
</bindings>

Vergessen Sie nicht, den bindingConfiguration="WsEventLogBinding" auf Ihrem Endpunkt anzuwenden.

0
YK1

Sie können die grundlegende http-Bindung mit TransportCredentialOnly security mode verwenden.

0
Damith