2009-06-04 3 views
25

J'ai un service WCF utilisant BasicHttpBinding avec l'authentification Windows. La plupart des clients sont des comptes de domaine et se connectent au service en utilisant leurs informations d'identification par défaut.Comment spécifier les informations d'identification Windows dans le fichier de configuration du client WCF

Maintenant, je veux me connecter au service à partir d'un client ASP.NET qui s'exécute sous un compte local. Je veux me connecter au service WCF en utilisant les informations d'identification Windows (domaine \ utilisateur et mot de passe) qui sont disponibles pour l'application ASP.NET.

Je sais que je peux le faire en code en utilisant ClientBase < T> .ClientCredentials.

Existe-t-il un moyen de spécifier les informations d'identification (domaine \ utilisateur et mot de passe) dans le fichier web.config du client afin de ne pas avoir à modifier le code?

EDIT

Si elle ne peut pas être fait dans le fichier de configuration, est-il un moyen d'utiliser System.Net.ICredentials ou System.Net.NetworkCredential comme des titres de compétence pour un service WCF? Le .NET Framework leur fournit une manière homogène de fournir des informations d'identification réseau, mais avec WCF, cela semble avoir été rejeté en faveur d'un nouveau système incompatible basé sur la classe System.ServiceModel.Description.ClientCredentials non liée.

EDIT 2

Accepter la réponse de Marc à la question initiale - il semble qu'il n'y a aucun moyen de le faire dans le fichier de configuration du client :(

Je considéreront cela comme une lacune dans WCF - Je n'accepte pas que Microsoft décourage délibérément de mettre des informations d'identification dans le fichier de configuration - après tout, ils doivent être stockés quelque part, et le cadre comprend des fonctionnalités pour crypter le fichier de configuration.Je suppose que je pourrais créer un BehaviorExtensionElement personnalisé pour cette , mais il devrait être disponible dès la sortie de la boîte

C'est aussi un peu incohérent: l'élément de configuration system.net/mailSettings/smtp/network permet de spécifier les informations d'identification, alors pourquoi pas WCF?

En ce qui concerne la deuxième question sur l'utilisation System.Net.NetworkCredential, il semble de this blog qu'il est possible, au moins lors de l'authentification Windows, avec le code suivant:

factory.Credentials.Windows.ClientCredential = 
    new System.Net.NetworkCredential(name, password, domain); 

Répondre

11

Vous ne pouvez spécifier votre informations d'identification dans le fichier de configuration, malheureusement - vous devez le faire dans le code (probablement parce que sinon vous pourriez vous retrouver avec des informations d'identification dans votre fichier de configuration, en texte brut - pas une bonne chose ....).

+3

« ... dans votre fichier de configuration, dans le texte brut » est généralement pas une bonne chose, mais dans le fichier de configuration crypté est OK. – Joe

+0

@marc_s N'est-il pas encore disponible pour le paramétrage via le fichier de configuration? –

+1

@Johnny_D: non, pas autant que je sache. –

0

Avez-vous essayé?

<system.web> 
     <identity impersonate="true" userName="username" password="password"/> 
</system.web> 
+2

Non, cela n'aide pas vraiment - le serveur ASP.NET n'est pas approuvé pour la délégation. – Joe

4

Je comprends qu'il n'y a pas un mécanisme permettant de spécifier les informations d'identification dans les < de liaison > balises, mais pourquoi ne pas le faire:

Svc.ClientCredentials.UserName.UserName = AppSettings["WCFSvcUsername"]; 
Svc.ClientCredentials.UserName.Password = AppSettings["WCFSvcPassword"]; 
+1

cela fonctionnerait - mais je vous recommande fortement de crypter votre fichier de configuration dans ce cas! –

+0

Oui, je sais que je peux le faire dans le code, je veux éviter de changer le code. – Joe

+0

Joe - mon exemple vous permettrait de spécifier votre nom d'utilisateur et votre mot de passe dans le fichier app/web.config car vous ne pouvez pas le faire nativement. – Lewis

18
Svc.ClientCredentials.UserName.UserName = AppSettings["WCFSvcUsername"]; 
Svc.ClientCredentials.UserName.Password = AppSettings["WCFSvcPassword"]; 

est incorrect.Il est utilisé avec sécurité des messages et clientCredentialType = "NomUtilisateur". Vous devez utiliser

Svc.ClientCredentials.Windows.ClientCredential = new NetworkCredential(...); 
+0

Je n'ai pas reçu votre message complet. Vous avez déjà connu la réponse à la question - désolé. – Steven

+0

Bien que ce soit une très vieille question, je poste ceci pour n'importe qui avec le même problème. – Steven

+7

Vous n'avez pas non plus votre phrase complète;) – Gagege

1
Svc.ClientCredentials.Windows.ClientCredential = 
    System.Net.CredentialCache.DefaultNetworkCredentials; 
5

Il semble qu'il n'y ait aucun moyen de définir id et mot de passe dans la configuration de liaison par défaut (je suis toujours), je l'ai fait ajouter le soufflet de code, mais souhaitez microsoft serait ajouter aux liaisons par défaut

<appSettings> 
    <add key="user" value="user" /> 
    <add key="password" value="password" /> 
    <add key="domain" value="domain" /> 
    </appSettings> 


    // client side code 
    string userName = ConfigurationManager.AppSettings.Get("user"); 
    string pswd = ConfigurationManager.AppSettings.Get("password"); 
    string domain = ConfigurationManager.AppSettings.Get("domain"); 

    client.ClientCredentials.Windows.ClientCredential.Domain = domain; 
    client.ClientCredentials.Windows.ClientCredential.UserName = userName; 
    client.ClientCredentials.Windows.ClientCredential.Password = pswd; 

Sebastian Castaldi

Questions connexes