38

在 .NET 中,似乎有几种方法可以获取当前的 Windows 用户名。其中三个是:

string name = WindowsIdentity.GetCurrent().Name;

或者

string name = Thread.CurrentPrincipal.Identity.Name;

或者

string name = Environment.UserName;

有什么区别,为什么选择一种方法而不是另一种方法?还有其他方法吗?

4

4 回答 4

32

Environment.UserName 在 advapi32.dll 中调用 GetUserName。这意味着,如果您冒充另一个用户,此属性将反映这一点。

Thread.CurrentPrincipal 有一个设置器,可以通过编程进行更改。(这不是冒充顺便说一句。)

WindowsIdentity 是您当前的Windows身份(如果有)。它不一定反映用户,想想带有 FormsAuthentication 的 ASP.NET。然后 WindowsIdentity 将是 NT 服务,但 FormsIdentity 将是登录用户。还有一个 PassportIdentity,您可以构建自己的东西以使事情进一步复杂化。

于 2010-07-04T19:19:16.080 回答
1

您要求其他方法。

当然,您始终可以使用本机 Windows API:GetUserName

于 2010-07-04T19:15:32.960 回答
0

我相信该属性被放置在几个地方,以便程序员更容易找到。只有一个登录用户,并且只有一个各自的名称。

于 2010-07-04T19:11:27.907 回答
0

三种方法描述如下:

HttpContext = HttpContext.Current.User,它返回一个 IPrincipal 对象,其中包含当前 Web 请求的安全信息。这是经过身份验证的 Web 客户端。

WindowsIdentity = WindowsIdentity.GetCurrent(),它返回当前正在执行的 Win32 线程的安全上下文的标识。

Thread = Thread.CurrentPrincipal,它返回当前执行的 .NET 线程的主体,该线程位于 Win32 线程之上。

它们会根据您的 IIS 配置而改变结果,如本文所述:http: //msdn.microsoft.com/en-us/library/aa302377.aspx

于 2013-09-04T08:23:41.260 回答