在 .NET 中,似乎有几种方法可以获取当前的 Windows 用户名。其中三个是:
string name = WindowsIdentity.GetCurrent().Name;
或者
string name = Thread.CurrentPrincipal.Identity.Name;
或者
string name = Environment.UserName;
有什么区别,为什么选择一种方法而不是另一种方法?还有其他方法吗?
在 .NET 中,似乎有几种方法可以获取当前的 Windows 用户名。其中三个是:
string name = WindowsIdentity.GetCurrent().Name;
或者
string name = Thread.CurrentPrincipal.Identity.Name;
或者
string name = Environment.UserName;
有什么区别,为什么选择一种方法而不是另一种方法?还有其他方法吗?
Environment.UserName 在 advapi32.dll 中调用 GetUserName。这意味着,如果您冒充另一个用户,此属性将反映这一点。
Thread.CurrentPrincipal 有一个设置器,可以通过编程进行更改。(这不是冒充顺便说一句。)
WindowsIdentity 是您当前的Windows身份(如果有)。它不一定反映用户,想想带有 FormsAuthentication 的 ASP.NET。然后 WindowsIdentity 将是 NT 服务,但 FormsIdentity 将是登录用户。还有一个 PassportIdentity,您可以构建自己的东西以使事情进一步复杂化。
您要求其他方法。
当然,您始终可以使用本机 Windows API:GetUserName。
我相信该属性被放置在几个地方,以便程序员更容易找到。只有一个登录用户,并且只有一个各自的名称。
三种方法描述如下:
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