2009-05-14 16 views
7

Ho scritto una semplice applicazione che utilizza WCF per comunicare tra client e server. Quando l'eseguo in locale funziona bene, ma quando ho eseguito il server e client su due scatole differenti ottengo la seguente eccezione:Impostazione delle credenziali per un'applicazione 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 

Quali sono le credenziali non essere accettato? E come posso impostarli?

C'è un modo per configurare il server per non richiedere l'autenticazione? L'applicazione è una semplice applicazione di monitoraggio per la sicurezza non è davvero un problema.

dispiace di non essere molto specifico: L'applicazione utilizza un proxy pipa e non v'è alcun file di configurazione WCF come il codice WCF è codificato mano.

Il mio codice WCF si basa sul codice in questo tutorial: http://www.switchonthecode.com/tutorials/wcf-tutorial-basic-interprocess-communication

non ho konw era proctice standard per generare le classi WCF da una configurazione fino a dopo che avevo finito di scrivere tutto il codice. Ora ogni volta che guardo un tutorial/help doc usano codice generato e tutto richiede di cambiare la configurazione.

Non ho la larghezza di banda (sto già manipolando 3 progetti) per sostituire il mio componente wcf con uno che usa il codice generato ma mi assicurerò di usare la generazione del codice la prossima volta che userò wcf.

+0

Penso che sia necessario essere più specifici. Qual è il legame che stai utilizzando? –

risposta

5

Creare un metodo come questo ...

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

e chiamarlo quando si crea il nuova classe cliente

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

obvously, questa è l'impostazione della informazioni per essere un utente specifico, e ha implicazioni per la sicurezza se il codice viene decompilato, ma dovrebbe funzionare nel vostro (scenario di file-meno config)

+0

Posso migrare quei valori nell'app.config. Semplicemente non ho un file di configurazione per il codice wcf. Grazie però a quello sembra buono. –

+0

come evitare di impostarlo in ogni utilizzo del mio client? C'è un modo per impostare questo per tutti i clienti nella mia soluzione? – SomeRandomName

11

Ecco una soluzione che ho trovato in una ricerca per disabilitare la sicurezza/autenticazione wcf.

Da MSDN:

WSHttpBinding b = new WSHttpBinding(); 

b.Security.Mode = SecurityMode.None; 

o aggiungere quanto segue in config:

<wsHttpBinding> 

    <binding name="myBinding"> 

     <security mode="None" /> 

    </binding> 

</wsHttpBinding> 
+0

È necessario fare attenzione a saltare per utilizzare questa soluzione poiché l'eccezione originale potrebbe derivare da una configurazione di associazione che utilizza l'autenticazione di Windows. In quel caso rimuovere la sicurezza alla cieca è una cattiva idea. Controlla la mia risposta in fondo nel caso di utilizzo dell'autenticazione di Windows. – atconway

+0

Ha funzionato bene, grazie :) –

1

Se sei utilizzando una configurazione vincolante WCF con il seguente di sicurezza:

<transport clientCredentialType="Windows" /> 

allora è necessario impostare in modo esplicito le credenziali di Windows nell'istanza WCF creato nel codice come di seguito:

'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() 
Problemi correlati