我认为标题已经足够清楚了。
最大的区别是它们不需要相同。
一般而言,HttpContext.Current.User
是登录用户(在工作线程上调用时),而 Thread.CurrentPrincipal
是工作进程的标识身份。
在 IIS 5.x 上,默认情况下 Thread.CurrentPrincipal
是 ASPNET
。在 IIS 6 及以上版本中,默认情况下 Thread.CurrentPrincipal
是 Network Service
(或您更改为的应用程序池标识)。
让事情变得更复杂的是,如果启用了 ASP.NET 模拟,则它们两个可能与登录用户相同。
建议阅读关于此主题的一些优秀书籍和 Microsoft MSDN 文章,
http://msdn.microsoft.com/zh-cn/library/ms998351.aspx
另一个建议是使用调试器附加到工作进程并在运行时检查它们,这可以让您有一个更好的了解。
请注意,
HttpContext.Current.User
不是查询登录用户身份的最佳方法。对于 WebForms,请使用Page.User
,对于 MVC,请使用Controller.User
,对于 Web API,请使用ApiController.User
。
另一个重要的区别是,您的代码并不总是可以访问HttpContext。(例如,如果您将所有业务逻辑放在可能或可能不会从Web应用程序使用的程序集中)虽然这两个用户帐户可能不同,但如果您使用Thread.CurrentPrincipal,则您的代码将始终能够在代码的任何位置获取该用户对象。