J'ai un service WCF utilisant BasicHttpBinding avec 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.
Maintenant, je souhaite me connecter au service à partir d'un client ASP.NET exécuté sous un compte local. Je souhaite me connecter au service WCF à l'aide des informations d'identification Windows (domaine\utilisateur et mot de passe) disponibles pour l'application ASP.NET.
Je sais que je peux le faire dans le 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 que je n'ai pas à changer le code?
MODIFIER
Si cela ne peut pas être fait dans le fichier de configuration, existe-t-il un moyen d'utiliser System.Net.ICredentials ou System.Net.NetworkCredential en tant qu'informations d'identification pour un service WCF?
Le .NET Framework les fournit comme un moyen 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 non liée System.ServiceModel.Description.ClientCredentials.
EDIT 2
Accepter la réponse de Marc à la question initiale - il semble qu'il n'y ait aucun moyen de faire cela dans le fichier de configuration du client :(
Je verrais cela comme une lacune de la WCF - je n'accepte pas que Microsoft devrait nous dissuader délibérément de mettre des informations d'identification dans le fichier de configuration -, après tout ce qu'elles doivent être stockées quelque part, et le Framework inclut des installations pour chiffrer le fichier de configuration. Je suppose que je pourrais créer un BehaviorExtensionElement personnalisé pour cela, mais il devrait être disponible immédiatement.
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 relative à l'utilisation de System.Net.NetworkCredential, il semble, d'après ce blog qu'il est possible, du moins lors de l'utilisation de l'authentification Windows, avec le code suivant:
factory.Credentials.Windows.ClientCredential =
new System.Net.NetworkCredential(name, password, domain);
Malheureusement, vous ne pouvez pas spécifier vos informations d'identification dans le fichier de configuration - 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 - ce n'est pas une bonne chose ....) .
Svc.ClientCredentials.UserName.UserName = AppSettings["WCFSvcUsername"];
Svc.ClientCredentials.UserName.Password = AppSettings["WCFSvcPassword"];
est incorrect. Il est utilisé avec message security et clientCredentialType = "UserName" . Tu devrais utiliser
Svc.ClientCredentials.Windows.ClientCredential = new NetworkCredential(...);
Il semble qu'il n'y ait aucun moyen de définir l'identifiant et le mot de passe dans la configuration de liaison par défaut (je cherche toujours), je l'ai fait en ajoutant le code ci-dessous, mais je souhaitais quand même que Microsoft l'ajoute 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
Je comprends qu’il n’existe pas de mécanisme permettant de spécifier les informations d’identité dans les balises <binding>, mais pourquoi ne pas procéder comme suit:
Svc.ClientCredentials.UserName.UserName = AppSettings["WCFSvcUsername"];
Svc.ClientCredentials.UserName.Password = AppSettings["WCFSvcPassword"];
Svc.ClientCredentials.Windows.ClientCredential =
System.Net.CredentialCache.DefaultNetworkCredentials;
Avez-vous essayé cela?
<system.web>
<identity impersonate="true" userName="username" password="password"/>
</system.web>