2010-02-23 7 views
28

Sto scrivendo del codice per utilizzare un componente di terze parti e ho bisogno di fornire un oggetto che implementa ICredentials quando inizio a usarlo.Come si ottengono le credenziali (NetworkCredential) dell'utente attualmente connesso?

Se scrivo quanto segue ...

var credential = new NetworkCredential("MyUsername", "MyPassword"); 

... e passare "credenziale", va bene. Ma vorrei passare le credenziali dell'utente attuale (è un servizio di Windows, quindi viene eseguito come utente specificato).

Ho provato entrambi dei seguenti, ma non sembrano lavorare (o restituire nulla):

NetworkCredential credential = System.Net.CredentialCache.DefaultCredentials; 
NetworkCredential credential = CredentialCache.DefaultNetworkCredentials; 

Qualcuno può suggerire come acquisire un oggetto approriate, che rappresenta le credenziali del nome utente il servizio è in esecuzione sotto?

Grazie, Ross

+0

See http://stackoverflow.com/questions/3166150/how-do-i-tell-a-wcf-client-proxy-class-to-use-windows-authentication-and-the-wind~~V~~singular~~3rd potrebbe essere necessario

+0

ho lo stesso problema con uno scenario client WCF, vedere questa discussione http://stackoverflow.com/questions/ 3166150/how-do-i-tell-a-wcf-client-proxy-class-to-use-windows-authentication-and-the-wind – Mahol25

+0

CredentialCache dovrebbe funzionare. Puoi controllare WindowsIdentity.GetCurrent e vedere che c'è davvero un utente registrato? –

risposta

0

Hai bisogno di fare la rappresentazione, per esempio:

System.Security.Principal.WindowsImpersonationContext impersonationContext; 
impersonationContext = 
    ((System.Security.Principal.WindowsIdentity)User.Identity).Impersonate(); 

//Insert your code that runs under the security context of the authenticating user here. 

impersonationContext.Undo(); 

http://support.microsoft.com/kb/306158

Oppure si può usare web.config:

<identity impersonate="true" /> 
+1

Grazie, ma sono in esecuzione come servizio Windows, non come una pagina Web ASP. Tutti i suggerimenti che ho trovato finora sono correlati ad ASP. Ho già provato la rappresentazione, ma non aiuta/funziona (in questo contesto). Sono sorpreso che non ci sia modo di acquisire le credenziali dell'utente corrente (che ha effettuato il login dopo tutto), e invece di codificare un metodo hacky per memorizzare nome utente e password dell'utente. Che schiffo ! (grazie per il suggerimento) –

2

hanno voi provato WindowsIdentity.GetCurrent()?

si potrebbe anche guardare questo esempio ... http://www.codeproject.com/KB/vb/Windows_Service.aspx

+0

"hai provato WindowsIdentity.GetCurrent?" Sì, non sembra aiutare - anche se si passa il risultato in Rappresenta L'esempio appena sembrava essere un interessante modo per ottenere il nome utente corrente Grazie –

0

La situazione della sicurezza ideale è che la password di un utente connesso non è memorizzato da nessuna parte nella memoria. Neanche è memorizzato da nessuna parte sul disco. Esiste solo come valore di hash da confrontare con una stringa inserita da un essere umano. Memorizzare una password in chiaro è intrinsecamente un rischio per la sicurezza e dovrebbe essere evitata quando possibile.

Dato questo principio, non c'è NESSUNA parte del sistema operativo che abbia anche la password dell'utente in chiaro, tanto meno voglia di darlo a voi.

+5

Sembra che ci sia un po '. (?). confusione qui. Non ho mai chiesto come acquisire la password, ho chiesto, dato che ho un processo che deve essere stato "loggato" (per mancanza di un termine migliore), è in esecuzione con credenziali valide. quelli a un componente di terze parti - non avevo bisogno di sapere cosa fossero. Sapevo che creasse un nuovo set di credenziali (presumendo che conoscessi la password) funzionava, ma non riuscivo a trovare un modo per acquisire (e trasmettere) le credenziali * correnti * –

+0

Questa è esattamente la situazione che stavo descrivendo. Per acquisire le credenziali correnti dovrebbero essere tenute da alcuni soft ware da qualche parte. Ciò ridurrebbe la sicurezza del sistema. La rappresentazione deve consentire qualsiasi componente che si desidera richiamare a _act_ come utente connesso senza richiedere le credenziali effettive. Non sono sicuro del motivo per cui mi hai downvoted e non la prima risposta a questo post, che ha fatto la stessa dichiarazione sulla sicurezza ("In effetti è una pratica non sicura"). –

+0

Avere un token firmato che rappresenta le credenziali del processo corrente (cui è consentito FARE cose, incluso parlare con altri programmi come se stesso, come processo) non è lo stesso che avere le credenziali. Poiché esistono diversi modi in cui un processo potrebbe comunicare con un altro processo, questo è configurabile. Passare questo token come argomento è il modo previsto per specificare che vogliamo autenticare "come me stesso" e non usare nuove credenziali. Questo è tutto ciò che stiamo cercando di fare. –

-1

se si desidera eseguire un processo come l'utente corrente aggiunge il verbo: "runas " & Environment.UserName

Se si desidera eseguire il processo come admin appena scritto "runas"

in vb.net

Dim ps As New System.Diagnostics.ProcessStartInfo("filepath", "arguments") 

ps.Verb = "runas" 'run as admin 

'ps.Verb = "runas " & Environment.UserName'run as current user, by default 

Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(ps) 

se si desidera ottenere la password dell'utente corrente, non è possibile, in effetti è una pratica non sicura. Quale diritto e per quale scopo il servizio ha bisogno di ottenere la password di Windows segreta? per esempio è come dare il codice pin del telefono per WhatsApp

+1

Questo non risponde alla domanda. – MgSam

0

Hai provato a impostare l'applicazione principale per l'appdominio all'inizio dell'applicazione?

AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal); 

impostazione di questo valore prima di accedere l'oggetto principale corrente tramite il filo si assicura l'identità di Windows viene utilizzato in questo oggetto.

modifica - Sono abbastanza sicuro che questo funziona per DefaultNetworkCredentials. L'ho usato per accedere a un servizio Web con l'autenticazione di Windows da un'app di Windows Form.