2009-08-13 14 views
7

i ont un code qui tente usurper les fenêtres des paramètres de sécurité des appelants, puis se connecter à un autre service WCF sur une autre machinefenêtres WCF erreur de sécurité d'authentification

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); 
} 

Mais je reçois l'erreur: « l'appelant n'a pas été authentifié par le service " System.ServiceModel .... La demande de jeton de sécurité n'a pas pu être satisfaite car l'authentification a échoué ...

Les informations d'identification que j'essaie d'emprunter sont des informations d'identification valides de Windows pour la case sur laquelle le service est activé .

Des idées pourquoi?

Répondre

0

L'usurpation d'identité de votre service à l'autre est un problème délicat, connu sous le nom de «double saut».

Je n'ai pas de réponse finale pour cela (je l'évite généralement en utilisant un compte de service explicite pour le service qui doit appeler un autre service). MAIS: vous devriez certainement vérifier le WCF Security Guidance sur CodePlex et rechercher "Usurpation d'identité" - il ya quelques articles qui expliquent tous les tenants et les aboutissants d'usurper l'identité d'un appelant original et pourquoi c'est compliqué.

Marc

1

D'accord avec ce marc_s est le problème de la double-hop.

Vous devez obtenir l'authentification Windows tout le long, donc:

  • La demande doit être faite dans le cadre d'un utilisateur de Windows
  • IIS doit être configuré pour utiliser l'authentification Windows
  • Web.config doit être configuré pour l'authentification Windows avec impersonate = true
  • L'utilisateur sur lequel votre pool d'applications s'exécute doit être autorisé à emprunter l'identité d'un utilisateur. C'est l'endroit habituel où le problème du double saut se produit.

Il existe un droit appelé « Imiter un client après l'authentification »

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

0

Si vous êtes sûr que vous avez les informations d'identification à droite sur les deux sauts, la prochaine chose que pourrait être à l'origine du Le problème est l'absence de EndpointDnsIdentity sur le noeud final.

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

Afin de soutenir votre scénario, vous devez avoir une bonne compréhension de la façon dont le travail Protocol Transition et Constrained Delegation. Vous devrez configurer à la fois Active Directory et vos points de terminaison de service WCF pour prendre en charge cela. Notez l'utilisation du nom principal de service (SPN). Jetez un coup d'oeil sur le lien suivant et voyez s'ils vous aident. L'article contient un exemple illustrant la configuration complète de bout en bout requise pour effectuer ce travail.

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

Questions connexes