2009-05-14 6 views
7

J'ai écrit une application simple qui utilise WCF pour communiquer entre le client et le serveur. Quand je lance localement il fonctionne très bien, mais quand je lance le serveur et le client sur deux boîtes différentes, je reçois l'exception suivante:Définition des informations d'identification pour une application WCF

Unexpected error occured, while getting the group names from the VDN server 
System.ServiceModel.Security.SecurityNegotiationException: The server has rejected the client credentials. 
System.Security.Authentication.InvalidCredentialException: The server has rejected the client credentials. 
System.ComponentModel.Win32Exception: The logon attempt failed 

Quels sont les pouvoirs qui ne sont pas acceptés? Et comment puis-je les définir?

Existe-t-il un moyen de configurer le serveur pour qu'il ne nécessite pas d'authentification? L'application est une application de surveillance simple à la sécurité n'est pas vraiment un problème.

Désolé de ne pas être très précis: L'application utilise un proxy de conduite et il n'y a pas de fichier de configuration WCF que le code WCF est codé main.

Mon code WCF est basé sur le code dans ce tutoriel: http://www.switchonthecode.com/tutorials/wcf-tutorial-basic-interprocess-communication

Je ne konw était proctice standard pour générer les classes de WCF d'une config qu'après que j'avais fini d'écrire tout le code. Maintenant, chaque fois que je regarde un tutoriel/document d'aide, ils utilisent le code généré et tout nécessite de changer la configuration. Je n'ai pas la bande passante (je jongle déjà avec 3 projets) pour remplacer mon composant wcf par un code généré mais j'utiliserai la génération de code la prochaine fois que j'utiliser wcf.

+0

Je pense que vous devez être plus précis. Quelle est la liaison que vous utilisez? –

Répondre

5

Créer une méthode comme ça ...

void SetImpersonation(ref IServiceClient proxy) 
{ 
    proxy.ClientCredentials.Windows.ClientCredential.Domain = "MYDOMAIN"; 
    proxy.ClientCredentials.Windows.ClientCredential.UserName = "A_USER"; 
    proxy.ClientCredentials.Windows.ClientCredential.Password = "P4SSW0RD"; 
} 

et l'appeler lorsque vous créez la nouvelle classe de client.

IServiceClient proxy = new IServiceClient(); 
SetImpersonation(ref proxy); 

obvously, ce met les informations à un utilisateur spécifique et a des implications de sécurité si votre code est décompilé, mais il devrait fonctionner dans votre (scénario de fichiers moins config)

+0

Je peux migrer ces valeurs dans le app.config. Je n'ai tout simplement pas de fichier de configuration pour le code wcf. Merci bien que cela semble bon. –

+0

comment éviter de régler cela dans chaque utilisation de mon client? Y a-t-il un moyen de définir ceci pour tous les clients dans ma solution? – SomeRandomName

11

Voici une solution trouvée dans une recherche de désactivation de la sécurité/authentification wcf.

De MSDN:

WSHttpBinding b = new WSHttpBinding(); 

b.Security.Mode = SecurityMode.None; 

ou ajouter ce qui suit dans la configuration:

<wsHttpBinding> 

    <binding name="myBinding"> 

     <security mode="None" /> 

    </binding> 

</wsHttpBinding> 
+0

Vous devez faire attention en sautant pour utiliser cette solution, car l'exception originale pourrait provenir d'une configuration de liaison utilisant l'authentification Windows. Dans ce cas, retirer aveuglément la sécurité est une mauvaise idée. Vérifiez ma réponse en bas dans le cas de l'utilisation de l'authentification Windows. – atconway

+0

A bien fonctionné, merci :) –

1

Si vous êtes en utilisant une configuration de liaison WCF avec la sécurité suivante:

<transport clientCredentialType="Windows" /> 

alors vous aurez besoin de définir explicitement les informations d'identification de Windows sur l'instance WCF créé dans le code comme ci-dessous:

'Create an instance of the WCF service  
Dim MyService As New MyWCFServiceClient 

'Build credentials object for which this WCF call will be made 
MyService.ClientCredentials.Windows.ClientCredential = New System.Net.NetworkCredential("UserName", "Password", "DomainName") 

'Call a method on the service 
MyService.MyMethod1() 
Questions connexes