在.NET Core控制台应用程序中(注意:不是ASP.NET Core!),如何获取当前用户?为了清楚起见,我正在寻找以前不再存在的Thread.CurrentPrincipal。 PlatformServices不包含此信息,环境也不包含。
答案 0 :(得分:21)
知道了。可能的选择是使用WindowsIdentity:
WindowsIdentity.GetCurrent().Name
必须添加System.Security.Principal.Windows包。 当然,这仅适用于Windows。
另一种选择是使用声明:
ClaimsPrincipal.Current
为此,要添加的包是System.Security.Claims。在Windows中,默认情况下,标识将为空。
答案 1 :(得分:10)
System.Security.Principal.Windows
不可用。以下对我有用:
Environment.UserName;
根据.NET Core System.Environment Source Code,这个解决方案"应该足以满足99%的情况。"
注意:请确保将DotNetCore 2.0
或更高版本定位为1.0
,1.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.Current
和Thread.CurrentPrincipal
始终为空(除非您已设置它们),此代码也不起作用:
IPrincipal principal = new GenericPrincipal(identity, null);
AppDomain.CurrentDomain.SetThreadPrincipal(principal);
此后ClaimsPrincipal.Current
和Thread.CurrentPrincipal
仍然为空。
WindowsIdentity.GetCurrent()
有效,但应该有更强有力的理由来引用System.Security.Principal.Window
然后获取"用户名"。