2016-04-05 11 views
10

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

ответ

14

Got it. Возможным вариантом является использование WindowsIdentity:

WindowsIdentity.GetCurrent().Name 

Необходимо добавить пакет System.Security.Principal.Windows. Конечно, это только для Windows.

Другой вариант заключается в использовании Претензии:

ClaimsPrincipal.Current 

Для того, чтобы пакет добавить в System.Security.Claims. В Windows по умолчанию идентификатор будет пустым.

+0

То, что я слышу между строками: ClaimsPrincipal - это будущее;) – Thomas

+0

'ClaimsPrincipal.Current' будет * не * работать в контроллере, он будет равен нулю. Вам нужно получить доступ к свойству 'HttpContext.User', которое действительно будет экземпляром' ClaimsPrincipal'. –

+0

Полезно знать. Статический API для ClaimsPrinciple не имеет никакого смысла в любом случае IMHO. – Thomas

4

System.Security.Principal.Windows не доступен, если вы не импортируете DLL вручную. Следующие работал для меня:

Environment.UserName; 

Согласно .NET Core System.Environment Source Code, это решение «должно хватить в 99% случаев.»

Примечание: убедитесь, что вы нацеливаете DotNetCore 2.0 или более поздние версии, поскольку 1.0 и 1.1 не имеют этого определения.

+0

У меня, похоже, нет '.UserName' в' Environment' –

+0

Убедитесь, что вы нацеливаете «DotNetCore 2.0» или более позднюю версию. 'DotNetCore 1.0' и' DotNetCore 1.1', похоже, не имеют '.UserName'. –

0

Если вы хотите использовать IIdentity абстракции, чтобы пройти через средний слой сделать это:

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

P.S. в основной 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, затем получить «имя пользователя».

Смежные вопросы