2016-04-05 6 views
10

In einer .NET Core-Konsolenanwendung (Anmerkung: nicht ASP.NET Core!), Wie kann ich den aktuellen Benutzer abrufen? Um es klar zu sagen, ich suche nach was früher als Thread.CurrentPrincipal verfügbar war, welches nicht mehr existiert. PlatformServices enthält diese Informationen nicht und auch Environment nicht.Aktuellen Benutzer in .NET Core Console erhalten

Antwort

14

Verstanden. Eine mögliche Option ist Windows zu verwenden:

WindowsIdentity.GetCurrent().Name 

Es ist notwendig, das System.Security.Principal.Windows Paket hinzuzufügen. Natürlich ist dies nur für Windows.

Eine weitere Option ist Ansprüche zu verwenden:

ClaimsPrincipal.Current 

Dafür das Paket hinzuzufügen ist System.Security.Claims. In Windows ist die Identität standardmäßig leer.

+0

Was ich zwischen den Zeilen höre: ClaimsPrincipal ist die Zukunft;) – Thomas

+0

'ClaimsPrincipal.Current' wird * nicht * in einem Controller arbeiten, wird es null sein. Sie müssen auf die Eigenschaft "HttpContext.User" zugreifen, die tatsächlich eine ClaimsPrincipal-Instanz ist. –

+0

Gut zu wissen. Eine statische API für ClaimsPrincipe macht sowieso keinen Sinn. – Thomas

4

System.Security.Principal.Windows ist nur verfügbar, wenn Sie die DLL manuell importieren. Die folgenden für mich gearbeitet:

Environment.UserName; 

Nach der .NET Core System.Environment Source Code diese Lösung „in 99% der Fälle ausreichen.“

Hinweis: Achten Sie darauf, dass Sie die Ausrichtung DotNetCore 2.0 oder später haben, da 1.0 und 1.1 diese Definition nicht haben.

+0

Ich habe anscheinend keinen ".UserName" in "Environment" –

+0

Stellen Sie sicher, dass Sie auf 'DotNetCore 2.0' oder später abzielen. 'DotNetCore 1.0' und' DotNetCore 1.1' scheinen nicht '.UserName' zu ​​haben. –

0

Wenn Sie IIdentity Abstraktion, um durch Ihre mittlere Schicht tun dies wieder verwenden wollen:

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

P. S. in Kern 2 Konsole App: ClaimsPrincipal.Current und Thread.CurrentPrincipal sind immer null (es sei denn, Sie Setup sie haben), und dieser Code wird entweder nicht:

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

danach ClaimsPrincipal.Current und Thread.CurrentPrincipal noch null sind.

WindowsIdentity.GetCurrent() funktioniert, aber es sollte mehr Gründe geben, zu referenzieren System.Security.Principal.Window dann erhalten Sie den "Benutzernamen".

Verwandte Themen