在.NET Core Console中获取当前用户

时间:2016-04-05 14:39:43

标签: .net .net-core

在.NET Core控制台应用程序中(注意:不是ASP.NET Core!),如何获取当前用户?为了清楚起见,我正在寻找以前不再存在的Thread.CurrentPrincipal。 PlatformServices不包含此信息,环境也不包含。

3 个答案:

答案 0 :(得分:21)

知道了。可能的选择是使用WindowsIdentity:

WindowsIdentity.GetCurrent().Name

必须添加System.Security.Principal.Windows包。 当然,这仅适用于Windows。

另一种选择是使用声明:

ClaimsPrincipal.Current

为此,要添加的包是System.Security.Claims。在Windows中,默认情况下,标识将为空。

答案 1 :(得分:10)

除非您手动导入DLL,否则

System.Security.Principal.Windows不可用。以下对我有用:

Environment.UserName;

根据.NET Core System.Environment Source Code,这个解决方案"应该足以满足99%的情况。"

注意:请确保将DotNetCore 2.0或更高版本定位为1.01.1没有此定义。

编辑2019年1月22日:该方法旧源的链接已过时。 PR 34654已将System.Environment移至CoreLib。对于那些对read the source code感兴趣的人,你仍然可以这样做,尽管评论表明它应该足以满足99%的情况"已被删除。

答案 2 :(得分:0)

如果您想重用IIdentity抽象来传递中间层,请执行以下操作:

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

P.S。在核心2控制台应用程序: ClaimsPrincipal.CurrentThread.CurrentPrincipal始终为空(除非您已设置它们),此代码也不起作用:

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

此后ClaimsPrincipal.CurrentThread.CurrentPrincipal仍然为空。

WindowsIdentity.GetCurrent()有效,但应该有更强有力的理由来引用System.Security.Principal.Window然后获取"用户名"。