Verwendung von STS und WCF mit einem Problem mit ungesicherter oder falsch gesicherter Fehlerausnahme

8

Ich arbeite mit ein paar WCF-Diensten, die alle mit WIF und einem STS-Provider gesichert sind (alle verwenden den Standardcode und Beispiele von Microsoft). Diese Dienste wurden alle mit .NET 3.5 erstellt und wurden alle kürzlich auf .NET 4.0 aktualisiert. ALLE .dlls, die den Diensten zugeordnet sind, wurden ebenfalls auf 4.0 aktualisiert. Diese Dienste haben jahrelang so lange gearbeitet, bis ich die Framework-Versionen aktualisiert habe.

Das Problem besteht nun, wenn ein Aufruf an einen WCF-Dienst erfolgt, der durch den STS-WCF-Dienst gesichert wurde. Ein Fehler wird generiert, nachdem das Token an die Clientanwendung zurückgegeben wurde, die den vom STS gesicherten WCF-Dienst aufgerufen hat:

  

Ein ungesicherter oder falsch gesicherter Fehler wurde von dem anderen empfangen   Party. Siehe die interne FaultException für den Fehlercode und die Details.

     

HResult -2146233087

     

{"Bei der Verarbeitung der Sicherheitstoken im   Nachricht. "}

     

Server-Stack-Ablaufverfolgung: um   System.ServiceModel.Channels.SecurityChannelFactory 1.SecurityRequestChannel.ProcessReply(Message reply, SecurityProtocolCorrelationState correlationState, TimeSpan timeout) at System.ServiceModel.Channels.SecurityChannelFactory 1.SecurityRequestChannel.Request (Nachricht   TimeSpan Timeout) um   System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.DoOperation (SecuritySessionOperation   Operation, EndpointAddress Ziel, Uri via, SecurityToken   currentToken, TimeSpan-Timeout) um   System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.GetTokenCore (TimeSpan   Timeout) um   System.IdentityModel.Selectors.SecurityTokenProvider.GetToken (TimeSpan   Timeout) um   System.ServiceModel.Security.SecuritySessionClientSettings'1.ClientSecuritySessionChannel.OnOpen (TimeSpan   Timeout) um   System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan   Timeout) um   System.ServiceModel.Channels.ServiceChannel.OnOpen (TimeSpan-Timeout)
  bei System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan   Timeout) um   System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call (ServiceChannel   Kanal, TimeSpan Timeout) um   System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce (TimeSpan   Timeout, CallOnceManager-Kaskade) um   System.ServiceModel.Channels.ServiceChannel.EnsureOpened (TimeSpan   Timeout) bei System.ServiceModel.Channels.ServiceChannel.Call (String   action, Boolean oneway, ProxyOperationRuntime-Operation, Object [] ins,   Objekt [] outs, TimeSpan Timeout) um   System.ServiceModel.Channels.ServiceChannel.Call (String-Aktion,   Boolean oneway, ProxyOperationRuntime-Operation, Object [] ins,   Objekt [] outs) bei   System.ServiceModel.Channels.ServiceChannelProxy.InvokeService (IMethodCallMessage   MethodeCall, ProxyOperationRuntime Operation) um   System.ServiceModel.Channels.ServiceChannelProxy.Invoke (IMessage   Nachricht)

     

Ausnahme erneut bei [0]: um   System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (IMessage   reqMsg, IMessage retMsg) bei   System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData & amp;   msgData, Int32-Typ) um   MyProject.IMyService.GetInfo ()   bei MyProject.Proxy.GetInfo () in   c: \ Projekte \ Proxy.cs: Zeile   36

Wenn man tiefer eingräbt, sieht man auch:

InvalidSecurityToken als InnerException.Code.Subcode.Name-Eigenschaftswert.

Also habe ich mir die folgenden Dinge angesehen, die alle ein Problem mit der Uhr auf dem System andeuten, und keines hat funktioniert:

Ссылка
Ein ungesicherter oder falsch gesicherter Fehler wurde von der Gegenpartei erhalten. (Wenn Sie mit SAML arbeiten)
Ссылка

Ich habe den Debugger in diesen Diensten angehängt und versucht, den Code durchzugehen, aber ich kann den Schuldigen nicht finden. Weiß jemand, wo ich mit diesem Thema nicht einverstanden sein könnte?

BEARBEITEN: Interessant ist der schwierige Teil des WIF im STS-Dienst, der die Authentifizierung durchführt ! Ich habe die Protokollierung aktiviert und Folgendes wird festgehalten:

%Vor%

Ich habe auch die WCF-Anmeldung in .config aktiviert, um die .svc-Dateien anzuzeigen, und sie ergaben keine Fehlerinformationen, die auf das Problem hinweisen. Es ist so, als ob die STS sagt: "Hey, du bist authentifiziert, wir haben dich übergeben und das Token generiert, und jetzt sind wir fertig!" Es scheint, dass der rufende Client das Token nicht mag. Dies hat jedoch für Äonen funktioniert, bis ich Framework-Versionen geändert habe. Aus meiner Kenntnis gab es keine wesentlichen WIF-Änderungen von 3.5 - & gt; 4.0, aber die großen Änderungen waren in 4.5, wo WIF in das Framework integriert wurde.

So alle der Autorisierung funktioniert, es gibt nur ein Problem mit dem Token akzeptiert wird, nehme ich vom Client an?

    
atconway 04.12.2013, 14:34
quelle

2 Antworten

1

Es könnte sein, dass der Client noch beide Versionen des Frameworks installiert hat.

Da die Namen der Klassen in beiden gleich sind, kann es sein, dass der Client Code von der "falschen" Version des Frameworks ausführt.

Um es zu beheben, können Sie die Klassennamen vollständig qualifizieren.

siehe: Ссылка

    
Shiraz Bhaiji 13.12.2013 22:29
quelle
1

Vor allem, wo Ihre Verfolgungsoptionen? Nur die Verfolgung von System.ServiceModel liefert möglicherweise nicht genügend Informationen. Zumindest sollten Sie System.ServiceModel.Activation hinzufügen, und wahrscheinlich ein paar zusätzliche mit WIF (und ich würde System.Security hinzufügen).

Ich hatte einen sehr ähnlichen Fehler bei der Verwendung von STS und der Integration eines Java-Clients mit einem .net-Server. Hier ist, wie ich es gelöst habe.

  1. Erstellen Sie einen neuen Client für den Dienst, und stellen Sie eine Verbindung zum Server her. Überwachen Sie Nachrichten mit Fiddler
  2. Machen Sie dasselbe mit dem aktuellen Client
  3. Vergleichen Sie die gesendeten Nachrichten. Ich weiß, dass Sie sie aus dem WCF-Ablaufprotokoll abrufen können, aber ich mag Fiddler besser.

Mein Fall, bei dem die Ablaufverfolgung mit der Nachrichtenüberprüfung kombiniert wurde, erlaubte mir, den Fehler zu finden (ein Richtlinienfehler auf dem Java-Client und ein dummer Codefehler in der benutzerdefinierten Sicherheitsrichtlinie des Dienstes).

Hoffe, das hilft!

Bearbeiten

Hier ist ein Link, der alle Verfolgungsaktivitäten einrichtet, mit Ausnahme von system.servicemodel.activation. Es kann nützlich sein

Ссылка

    
Carlos Grappa 16.12.2013 16:17
quelle