2016-04-05 43 views
10

In un'applicazione console .NET Core (nota: non in ASP.NET Core!), Come posso ottenere l'utente corrente? Per essere chiari, sto cercando quello che era disponibile come Thread.CurrentPrincipal, che non esiste più. PlatformServices non contiene queste informazioni e nemmeno Ambiente.Ottenere l'utente corrente in .NET Core Console

risposta

14

Capito. Un'opzione possibile è quella di utilizzare WindowsIdentity:

WindowsIdentity.GetCurrent().Name 

E 'necessario aggiungere il pacchetto System.Security.Principal.Windows. Ovviamente, questo è solo per Windows.

Un'altra opzione è quella di utilizzare Reclami:

ClaimsPrincipal.Current 

Per questo, il pacchetto da aggiungere è System.Security.Claims. In Windows, per impostazione predefinita, l'identità sarà vuota.

+0

Quello che sento tra le righe: ClaimsPrincipal è il futuro;) – Thomas

+0

'ClaimsPrincipal.Current' * non * funziona in un controller, sarà nullo. È necessario accedere alla proprietà 'HttpContext.User', che sarà in effetti un'istanza' ClaimsPrincipal'. –

+0

Buono a sapersi. Un'API statica per ClaimsPrinciple non ha comunque molto senso. – Thomas

4

System.Security.Principal.Windows non disponibile se non si importa manualmente la DLL. Di seguito ha lavorato per me:

Environment.UserName; 

Secondo il .NET Core System.Environment Source Code, questa soluzione "dovrebbe essere sufficiente nel 99% dei casi."

Nota: assicurarsi di avere come target DotNetCore 2.0 o successivo come 1.0 e 1.1 non avere questa definizione.

+0

Non sembra che abbia un '.UserName' in' Ambiente' –

+0

Assicurati di scegliere come target 'DotNetCore 2.0' o successivo. 'DotNetCore 1.0' e' DotNetCore 1.1' non sembrano avere '.UserName'. –

0

Se si desidera riutilizzare IIdentity astrazione di passare attraverso il vostro strato intermedio fare questo:

var identity = new GenericIdentity(Environment.UserDomainName + "\\" + Environment.UserName, "Anonymous"); 

P.S. nel nucleo 2 console app: ClaimsPrincipal.Current e Thread.CurrentPrincipal sono sempre nullo (se non si dispone di installazione loro) e questo codice non funziona nemmeno:

IPrincipal principal = new GenericPrincipal(identity, null); 
AppDomain.CurrentDomain.SetThreadPrincipal(principal); 

dopo questo ClaimsPrincipal.Current e Thread.CurrentPrincipal sono ancora nullo.

WindowsIdentity.GetCurrent() funziona, ma ci dovrebbero essere motivi più forti per fare riferimento a System.Security.Principal.Window quindi ottenere il "nome utente".

Problemi correlati