2009-05-14 10 views
7

Ich habe eine einfache Anwendung geschrieben, die WCF verwendet, um zwischen Client und Server zu kommunizieren. Wenn ich es lokal ausführen es funktioniert gut, aber wenn ich laufe den Server und Client auf zwei verschiedenen Feldern ich die folgende Ausnahme erhalten:Anmeldeinformationen für eine WCF-Anwendung festlegen?

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 

Was die Anmeldeinformationen sind, die nicht akzeptiert werden? Und wie kann ich sie einstellen?

Gibt es eine Möglichkeit, den Server so zu konfigurieren, dass keine Authentifizierung erforderlich ist? Die Anwendung ist eine einfache Überwachungs-App zur Sicherheit ist nicht wirklich ein Problem.

Tut mir leid, nicht sehr spezifisch zu sein: Die App verwendet ein Rohr Proxy und es gibt keine wcf Konfigurationsdatei als wcf Code Hand codiert.

Mein WCF-Code wird auf dem Code in diesem Tutorial basiert: http://www.switchonthecode.com/tutorials/wcf-tutorial-basic-interprocess-communication

ich nicht konw es Standard proctice war die WCF-Klassen aus einer Config bis zu erzeugen, nachdem ich fertig war die gesamten Code zu schreiben. Wenn ich nun ein Tutorial/Hilfe doc ansehe, benutzen sie generierten Code und alles erfordert eine Änderung der Konfiguration.

Ich habe nicht die Bandbreite (ich jongliere bereits 3 Projekte), um meine wcf-Komponente durch einen zu ersetzen, der generierten Code verwendet, aber ich werde sicherstellen, die Code-Generierung beim nächsten Mal zu verwenden.

+0

Ich denke, Sie müssen genauer sein. Was ist die Bindung, die du verwendest? –

Antwort

5

Erstellen Sie eine Methode wie diese ...

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

und es nennen, wenn Sie das schaffen neue Clientklasse

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

Obvously, diese die Informationen setzt einen bestimmten Benutzer zu sein, und hat Auswirkungen auf die Sicherheit, wenn Ihr Code dekompiliert wird, aber es sollte in Ihrem (config-Datei-less-Szenario)

+0

Ich kann diese Werte in die app.config migrieren. Ich habe gerade keine Konfigurationsdatei für den WCF-Code. Danke, obwohl das gut aussieht. –

+0

Wie kann vermieden werden, dies bei jeder Verwendung meines Clients einzustellen? Gibt es eine Möglichkeit, dies für alle Clients in meiner Lösung festzulegen? – SomeRandomName

11

Hier ist eine Lösung, die ich in einer Suche nach Deaktivierung von WCF-Sicherheit/Authentifizierung gefunden habe.

Von MSDN:

WSHttpBinding b = new WSHttpBinding(); 

b.Security.Mode = SecurityMode.None; 

oder die folgende in Config hinzu:

<wsHttpBinding> 

    <binding name="myBinding"> 

     <security mode="None" /> 

    </binding> 

</wsHttpBinding> 
+0

Sie müssen vorsichtig sein, wenn Sie diese Lösung verwenden, da die ursprüngliche Ausnahme von einer verbindlichen Konfiguration mit Windows-Authentifizierung stammen könnte. In diesem Fall ist es eine schlechte Idee, die Sicherheit blind zu entfernen. Überprüfen Sie meine Antwort unten im Fall der Verwendung der Windows-Authentifizierung. – atconway

+0

Hat gut funktioniert, danke :) –

1

Wenn Sie arbeiten, sind Verwendung einer WCF-Bindungskonfiguration mit dem folgenden Sicherheits:

<transport clientCredentialType="Windows" /> 

dann müssen Sie explizit die Windows-Anmeldeinformationen auf der WCF-Instanz in Code wie unten erstellt einzustellen:

'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() 
Verwandte Themen