2009-05-14 21 views
7

Napisałem prostą aplikację, która wykorzystuje WCF do komunikacji między klientem a serwerem. Kiedy uruchamiam go lokalnie działa dobrze, jednak po uruchomieniu serwera i klienta na dwóch różnych polach pojawia się następujący wyjątek:Ustawianie poświadczeń dla aplikacji 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 

Jakie są poświadczenia nie są akceptowane? I jak mogę je ustawić?

Czy istnieje sposób skonfigurowania serwera tak, aby nie wymagał uwierzytelniania? Aplikacja jest prostą aplikacją monitorującą, ponieważ bezpieczeństwo nie stanowi problemu.

Niestety o nie jest bardzo specyficzny: Aplikacja używa proxy rur i nie ma WCF plik konfiguracyjny jak kod wcf jest ręcznie kodowane.

Mój kod WCF jest oparty na kodzie w tym tutorialu: http://www.switchonthecode.com/tutorials/wcf-tutorial-basic-interprocess-communication

nie konw było standardem proctice wygenerować klas wcf z config till po skończyłem pisać cały kod. Teraz, gdy patrzę na samouczek/dokument pomocy, używają wygenerowanego kodu i wszystko wymaga zmiany konfiguracji.

Nie mam przepustowości (ja już żongluję 3 projektami), aby zastąpić mój komponent wcf jednym tht używa wygenerowanego kodu, ale będę musiał użyć generowania kodu następnym razem, gdy użyję wcf.

+0

Myślę, że musisz być bardziej konkretny. Jakie jest wiązanie, z którego korzystasz? –

Odpowiedz

5

utworzyć metodę jak to ...

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

i nazywają to podczas tworzenia nowa klasa klienta.

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

Obvously, to jest ustawienie informacji będzie konkretnego użytkownika i ma wpływ na bezpieczeństwo, jeśli kod jest dekompilować, ale to powinno działać w (scenariusz plików mniej config)

+0

Mogę przenieść te wartości do pliku app.config. Po prostu nie mam pliku konfiguracyjnego dla kodu wcf. Dzięki, że wygląda dobrze. –

+0

jak uniknąć ustawienia tego przy każdym użyciu mojego klienta? Czy istnieje sposób ustawienia tego dla wszystkich klientów w moim rozwiązaniu? – SomeRandomName

11

Oto rozwiązanie, które znalazłem w poszukiwaniu wyłączenia bezpieczeństwa/uwierzytelniania wcf.

Od MSDN:

WSHttpBinding b = new WSHttpBinding(); 

b.Security.Mode = SecurityMode.None; 

lub dodać następujące w config:

<wsHttpBinding> 

    <binding name="myBinding"> 

     <security mode="None" /> 

    </binding> 

</wsHttpBinding> 
+0

Musisz ostrożnie przeskoczyć, aby użyć tego rozwiązania, ponieważ pierwotny wyjątek mógł pochodzić z konfiguracji wiązania przy użyciu uwierzytelniania systemu Windows. W takim przypadku ślepe usunięcie zabezpieczenia jest złym pomysłem. Sprawdź moją odpowiedź na dole w przypadku korzystania z uwierzytelniania systemu Windows. – atconway

+0

Dobrze działa, dziękuję :) –

1

Jeżeli jesteś przy użyciu konfiguracji wiązania WCF z następujących zabezpieczeń:

<transport clientCredentialType="Windows" /> 

następnie trzeba będzie jawnie ustawić poświadczenia systemu Windows na przykład WCF utworzonego w kodzie jak poniżej:

'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() 
Powiązane problemy