2010-01-14 29 views
9

Devo passare un oggetto NetworkCredential con le credenziali dell'utente correntemente rappresentato a un servizio Web da un'applicazione asp.net.
Il mio codice è simile al seguente:Impersonation and NetworkCredential

WindowsIdentity windowsIdentity = HttpContext.Current.User.Identity as WindowsIdentity; 
WindowsImpersonationContext context = windowsIdentity.Impersonate(); 
try { 
    var client = GetClient(); 
    client.ClientCredentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials; 
    Log("WindowsIdentity = {0}", windowsIdentity.Name); 
    Log("DefaultNetworkCredentials = {0}", CredentialCache.DefaultNetworkCredentials.UserName); 
    client.DoSomething(); 
} finally { 
    context.Undo(); 
} 

avevo capito che CredentialCache.DefaultNetworkCredentials dovrebbe dare le credenziali dell'utente attualmente rappresentato, ma non è il caso.
I messaggi di log che ricevo sono

WindowsIdentity = TESTDOMAIN\TESTUSER 
DefaultNetworkCredentials = 

sto facendo qualcosa di sbagliato? In tal caso, come si ottiene un oggetto NetworkCredential per l'utente attualmente rappresentato?

+3

Non si tratta di una manifestazione del problema del doppio salto? http://blogs.msdn.com/knowledgecast/archive/2007/01/31/the-double-hop-problem.aspx – Richard

+0

Sì, sembra correlato al problema del doppio salto come il token secondario che si avrà in ASP non ti darà le credenziali di rete. –

risposta

4

Un po 'lungo articolo di MSDN che spiega le opzioni per ottenere le credenziali di rete in ASP:

How To: Use Impersonation and Delegation in ASP.NET 2.0

Un altro articolo del blog sul tema (anche se non ho controllato se il soluzione funziona davvero:

.NET (C#) Impersonation with Network Credentials

+0

Chiedo una domanda correlata, la prego di controllarla: http://stackoverflow.com/questions/18842970/asp-net-imperonate-in-netframework-2-vs-netframework-4 –

+0

Il secondo articolo definisce una classe che richiede la password da inserire e inviare come parametro. Penso che il vantaggio della rappresentazione sia in una modalità di autenticazione di Windows che sia in grado di utilizzare il preside e l'identità per accedere alle risorse di rete. Come ha affermato il prossimo poster, il metodo semplice non è possibile al di là della macchina locale (senza kerberos, che non è semplice ...) – Thronk

1

Non è possibile utilizzare l'asp.net impersonato utente (Current.User.Identity) per l'autenticazione di rete, funziona solo a livello locale.