Получение текущего пользователя в консоли .NET Core

В консольном приложении .NET Core (обратите внимание: не ASP.NET Core!), как я могу получить текущего пользователя? Чтобы быть ясным, я ищу то, что раньше было доступно как Thread.CurrentPrincipal, которое больше не существует. PlatformServices не содержит эту информацию, и среда тоже.

Ответ 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, затем получить "имя пользователя".