В консольном приложении .NET Core (обратите внимание: не ASP.NET Core!), как я могу получить текущего пользователя? Чтобы быть ясным, я ищу то, что раньше было доступно как Thread.CurrentPrincipal, которое больше не существует. PlatformServices не содержит эту информацию, и среда тоже.
Получение текущего пользователя в консоли .NET Core
Ответ 1
Получил это. Возможным вариантом является использование WindowsIdentity:
WindowsIdentity.GetCurrent().Name
Необходимо добавить пакет System.Security.Principal.Windows. Конечно, это только для Windows.
Другим вариантом является использование претензий:
ClaimsPrincipal.Current
Для этого пакет для добавления - System.Security.Claims. В Windows по умолчанию идентификатор будет пустым.
Ответ 2
System.Security.Principal.Windows
недоступна, если вы не импортируете DLL вручную. Следующее работало для меня:
Environment.UserName;
Согласно исходному коду .NET Core System.Environment, этого решения "должно хватить в 99% случаев".
Примечание. Убедитесь, что вы нацелены на DotNetCore 2.0
или более DotNetCore 2.0
1.0
и 1.1
не имеют этого определения.
Редактировать 22 января 2019 года: ссылка на старый источник метода устарела. PR 34654 переместил System.Environment
чтобы жить в CoreLib
. Для тех, кому интересно читать исходный код, вы все равно можете это сделать, хотя комментарий с предложением "его должно хватить в 99% случаев" был удален.
Ответ 3
Если вы хотите повторно использовать абстракцию IIdentity
для прохождения через средний слой, выполните следующие действия:
var identity = new GenericIdentity(Environment.UserDomainName + "\\" + Environment.UserName, "Anonymous");
P.S. в консольном приложении Core 2:
ClaimsPrincipal.Current
и Thread.CurrentPrincipal
всегда равны нулю (если вы не настроили их), и этот код не будет работать:
IPrincipal principal = new GenericPrincipal(identity, null);
AppDomain.CurrentDomain.SetThreadPrincipal(principal);
после этого ClaimsPrincipal.Current
и Thread.CurrentPrincipal
остаются нулевыми.
WindowsIdentity.GetCurrent()
работает, но должны быть более веские причины ссылаться на System.Security.Principal.Window
, затем получить "имя пользователя".