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
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.
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.
Ich habe anscheinend keinen ".UserName" in "Environment" –
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. –
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".
Was ich zwischen den Zeilen höre: ClaimsPrincipal ist die Zukunft;) – Thomas
'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. –
Gut zu wissen. Eine statische API für ClaimsPrincipe macht sowieso keinen Sinn. – Thomas