2009-08-13 9 views
7

i einige Code haben, der die Anrufer Fenster Sicherheitseinstellungen versucht Identitätswechsel und dannWCF Windows-Authentifizierung Sicherheitsfehler

WindowsIdentity callerWindowsIdentity = ServiceSecurityContext.Current.WindowsIdentity; 
using (callerWindowsIdentity.Impersonate()) 
{ 
    NetTcpBinding binding = new NetTcpBinding(); 
    binding.Security.Mode = SecurityMode.Message; 
    binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows; 
    EndpointAddress endpoint = new EndpointAddress(new Uri("net.tcp://serverName:9990/TestService1")); 
    ChannelFactory<WCFTest.ConsoleHost.IService1> channel = new ChannelFactory<WCFTest.ConsoleHost.IService1>(binding, endpoint); 
    WCFTest.ConsoleHost.IService1 service = channel.CreateChannel(); 
    return service.PrintMessage(msg); 
} 

auf einer anderen Maschine zu einem anderen WCF-Dienst verbinden Aber ich bekomme die Fehlermeldung: „der Anrufer war nicht durch den Dienst authentifiziert“ System.ServiceModel .... der Antrag auf Sicherheitstoken konnte nicht zufrieden sein, da die Authentifizierung fehlgeschlagen ...

die Anmeldeinformationen I der Dienst auf nachzuahmen versuche, sind valide Credential Fenster für die Box .

Irgendwelche Ideen warum?

Antwort

0

Identitätswechsel von Ihnen Service zum nächsten ist ein heikles Thema, bekannt als "Doppel-Hop" Problem.

Ich habe keine endgültige Antwort dafür (ich vermeide es normalerweise, indem ich ein explizites Dienstkonto für den Dienst verwende, der einen anderen Dienst aufrufen muss).

ABER: Sie sollten auf jeden Fall die WCF Security Guidance auf CodePlex und suchen Sie nach "Identitätswechsel" - gibt es eine ganze Reihe von Artikeln, die alle Ins und Outs der Identität eines ursprünglichen Anrufers erklären und warum es schwierig ist.

Marc

1

mit marc_s zustimmen, dass dies das Double-Hop-Problem.

Sie benötigen die Windows-Authentifizierung den ganzen Weg durch bekommen, deshalb:

  • Der Antrag muss
  • IIS Fenster konfiguriert werden muss im Zusammenhang mit einem Windows-Benutzern vorgenommen werden Authentifizierung verwenden
  • Web.config muss für die Windows-Authentifizierung mit impersonate = true eingerichtet sein.
  • Der Benutzer, mit dem der Anwendungspool ausgeführt wird, muss die Identität eines Benutzers annehmen können. Dies ist der übliche Ort, an dem das Doppelsprungproblem auftritt.

Es gibt ein Recht „Annehmen der Clientidentität nach Authentifizierung“

http://blogs.technet.com/askperf/archive/2007/10/16/wmi-troubleshooting-impersonation-rights.aspx

0

Wenn Sie sicher, dass Sie die Anmeldeinformationen haben das Recht auf beiden Hops, die nächste Sache, die könnte die verursachen genannt ist Problem ist das Fehlen der EndpointDnsIdentity, die auf dem Endpunkt festgelegt ist.

DnsEndpointIdentity identity = new DnsEndpointIdentity("localhost"); // localhost is default. Change if your service uses a different value in the service's config. 
Uri uri = new Uri("net.tcp://serverName:9990/TestService1"); 
endpoint = new EndpointAddress(uri, identity, new AddressHeaderCollection()); 
3

Um Ihr Szenario zu unterstützen, müssen Sie verstehen, wie Protocol Transition und Constrained Delegation Arbeit haben. Sie müssen sowohl Active Directory als auch Ihre WCF-Dienstendpunkte konfigurieren, um dies zu unterstützen. Beachten Sie die Verwendung des Dienstprinzipalnamens (SPN). Schau dir den folgenden Link an und sieh, ob sie dir helfen. Der Artikel enthält ein Beispiel, um die vollständige End-to-End-Konfiguration zu demonstrieren, die erforderlich ist, damit das funktioniert.

How To: Impersonate the Original Caller in WCF Calling from a Web Application

Verwandte Themen