2009-08-10 6 views
3

mon client sur le serveur A appelle un service sur B, qui appelle un service sur C.
Afin d'obtenir l'appel de travail B> CI doivent faire:fenêtres WCF pouvoirs

channel.Credentials.Windows.ClientCredential = 
    new System.Net.NetworkCredential("WndowsUserName", "WindowsPassWord"); 
IService1 service = channel.CreateChannel(); 

etc Le nom d'utilisateur et le mot de passe sont les informations d'identification Windows utilisées à partir de A-> B Bien sûr, je ne veux pas coder en dur cela, alors comment puis-je faire cela sans codage en dur?

J'ai essayé, sans succès:

WindowsIdentity callerWindowsIdentity = 
    ServiceSecurityContext.Current.WindowsIdentity; 
using (callerWindowsIdentity.Impersonate()) 

Répondre

0

Peut-être la classe

System.Net.CredentialCache 

pourrait être ... helpfull Il a les propriétés DefaultCredentials et DefaultNetworkCredentials que vous pouvez utiliser. Bien sûr, vous devrez vous assurer que votre application s'exécute sous les informations d'identification que vous voulez (c'est-à-dire, les informations d'identification de l'utilisateur actuel). Cela peut se faire en appelant

AppDomain.CurrentDomain.SetPrincipalPolicy (PrincipalPolicy.WindowsPrincipal); 

Au début de votre programme. Puis, lorsque vous initialisez le service WCF, vous pouvez utiliser le DefaultNetworkCredentials fourni par CredentialCache.

channel.Credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials; 
IService1 service = channel.CreateChannel(); 
2

Utilisez

System.Net.CredentialCache.DefaultNetworkCredentials 
propriété

. Il représente les informations d'identification d'authentification pour le contexte de sécurité actuel dans lequel l'application s'exécute. Les détails peuvent être trouvés here.

+0

DefaultNetworkCredentials a toutes les propriétés vides lorsque je l'exécute dans l'application client et à partir de mon service!?! Et ce lien est en chinois :) –

1

Il semble s'agir d'un problème d'authentification «double saut». En résumé, NTLM n'autorise pas plus d'un "saut" avec ses informations d'identification (jeton). L'utilisateur s'authentifie sur le serveur 1 avec son jeton, et à son tour, le serveur 1 tente d'envoyer le jeton au serveur 2. Cela ne fonctionnera pas, sauf si la délégation Kerberos est autorisée entre les serveurs 1 et 2.

Plus de détails ici: http://weblogs.asp.net/owscott/archive/2008/08/22/iis-windows-authentication-and-the-double-hop-issue.aspx Et ici: http://blogs.msdn.com/nunos/archive/2004/03/12/88468.aspx

+0

Est-ce la même chose lors de l'hoasting dans une application de console? Je suppose que oui c'est ce que je fais! Donc, si l'utilisation de l'authentification Windows consiste à contourner ce que je fais, c'est-à-dire à utiliser des informations de compte d'utilisateur différentes pour dépasser le premier saut? –

+0

Oui, cela s'applique. Le jeton NTLM peut seulement "faire" un saut. Si vous voulez autoriser plus de sauts, vous devez utiliser la délégation Kerberos pour "autoriser" un serveur à transmettre le jeton qu'il a à un autre serveur. – mathieu