2009-06-04 10 views
25

Ho un servizio WCF che utilizza BasicHttpBinding con l'autenticazione di Windows. La maggior parte dei client sono account di dominio e si connettono al servizio utilizzando le loro credenziali predefinite.Come specificare le credenziali di Windows nel file di configurazione del client WCF

Ora desidero connettermi al servizio da un client ASP.NET in esecuzione con un account locale. Desidero connettermi al servizio WCF utilizzando le credenziali di Windows (dominio \ utente e password) disponibili per l'applicazione ASP.NET.

So che posso farlo nel codice utilizzando ClientBase < T> .ClientCredentials.

C'è un modo per specificare le credenziali (dominio \ utente e password) nel file web.config del client in modo da non dover cambiare il codice?

EDIT

Se non può essere fatto nel file di configurazione, c'è un modo di usare System.Net.ICredentials o System.Net.NetworkCredential come credenziale per un servizio WCF?

.NET Framework fornisce questi come un modo omogeneo di fornire credenziali di rete, ma con WCF questo sembra essere stato gettato a favore di un nuovo sistema incompatibile basato sulla classe System.ServiceModel.Description.ClientCredentials non correlata.

EDIT 2

Accettare la risposta di Marc alla domanda iniziale - sembra che ci sia alcun modo per farlo nel file di configurazione del client :(

vorrei vedere questo come un deficit di WCF - Non accetto che Microsoft dovrebbe deliberatamente scoraggiarci dal mettere le credenziali nel file di configurazione - dopo tutto devono essere archiviate da qualche parte, e il Framework include funzionalità per crittografare il file di configurazione. Suppongo di poter creare un BehaviorExtensionElement personalizzato per questo , ma dovrebbe essere disponibile fuori dalla scatola

È anche un po 'incoerente: l'elemento di configurazione system.net/mailSettings/smtp/network consente di specificare le credenziali, quindi perché non utilizzare WCF?

Per quanto riguarda la seconda domanda sull'uso System.Net.NetworkCredential, sembra da this blog che sia possibile, almeno quando si utilizza l'autenticazione di Windows, con il seguente codice:

factory.Credentials.Windows.ClientCredential = 
    new System.Net.NetworkCredential(name, password, domain); 

risposta

11

Non è possibile specificare la vostra le credenziali nel file di configurazione, sfortunatamente, devi farlo nel codice (molto probabilmente perché altrimenti potresti finire con le credenziali nel tuo file di configurazione, in chiaro ... non è una buona cosa ...).

+3

"... nel file di configurazione, in formato testo" non è generalmente una buona cosa, ma nel file di configurazione criptato è OK. – Joe

+0

@marc_s Non è ancora disponibile per l'impostazione tramite file di configurazione? –

+1

@Johnny_D: no, non per quanto ne so. –

0

Hai provato questo?

<system.web> 
     <identity impersonate="true" userName="username" password="password"/> 
</system.web> 
+2

No, questo non aiuta - il server ASP.NET non è considerato affidabile per la delega. – Joe

4

ho capito che non c'è un meccanismo per specificare le credenziali all'interno delle <vincolanti> tag, ma perché non fare questo:

Svc.ClientCredentials.UserName.UserName = AppSettings["WCFSvcUsername"]; 
Svc.ClientCredentials.UserName.Password = AppSettings["WCFSvcPassword"]; 
+1

che funzionerebbe, ma ti consiglio caldamente di crittografare il tuo file di configurazione in questo caso! –

+0

Sì, lo so che posso farlo in codice, voglio evitare di cambiare il codice. – Joe

+0

Joe: il mio esempio consente di specificare il nome utente e la password nel file app/web.config poiché non è possibile farlo in modo nativo. – Lewis

18
Svc.ClientCredentials.UserName.UserName = AppSettings["WCFSvcUsername"]; 
Svc.ClientCredentials.UserName.Password = AppSettings["WCFSvcPassword"]; 

non è corretto.Viene utilizzato con la sicurezza dei messaggi e clientCredentialType = "Nome utente". Si dovrebbe usare

Svc.ClientCredentials.Windows.ClientCredential = new NetworkCredential(...); 
+0

Non ho fatto il tuo post completo. Hai già conosciuto la risposta alla domanda - scusa. – Steven

+0

Anche se questa è una domanda molto vecchia, la pubblico per chiunque abbia lo stesso problema. – Steven

+7

Inoltre non hai eseguito la tua frase completa;) – Gagege

1
Svc.ClientCredentials.Windows.ClientCredential = 
    System.Net.CredentialCache.DefaultNetworkCredentials; 
5

sembra che ci sia alcun modo per impostare ID e la password nella configurazione di default di legame (sto ancora cercando), l'ho fatto aggiungendo il codice qui sotto, ma ancora desiderare Microsoft avrebbe inserirlo alle combinazioni predefinite

<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