http.context.user和thread.currentprincipal之间的区别以及何时使用它们?

我最近遇到了在visual studio 2008下运行asp.net web应用程序的问题。我得到错误’类型未解析成员… customUserPrincipal’。 跟踪各种讨论组时,在为Thread.CurrentPrincipal分配自定义主体时,Visual Studio的Web服务器似乎存在问题。

在我的代码中,我现在使用…

HttpContext.Current.User = myCustomPrincipal //Thread.CurrentPrincipal = myCustomPrincipal 

我很高兴我把错误排除在外,但它引出了一个问题“这两种设置主体的方法有什么不同?”。 还有其他与差异相关的stackoverflow 问题 ,但他们没有深入了解这两种方法的细节。

我确实找到了一篇引人注目的post,其中有以下宏伟的评论,但没有任何解释来支持他的断言……

对所有Web(ASPX / ASMX)应用程序使用HttpConext.Current.User。

将Thread.CurrentPrincipal用于所有其他应用程序,如winForms,控制台和Windows服务应用程序。

你们中的任何一位安全/ dot.net专家能否对这个问题有所了解?

在webforms应用程序下,我相信Thread.CurrentPrincipal将是运行工作进程(Thread)的任何人的主体。

HttpContext.Current.User将是当前登录的Web用户。

对于forms / wpf应用程序,它是有意义的,因为您运行该应用程序的用户是您感兴趣的用户。

您是否想要伪装工作进程或登录用户?

HttpApplication对象在获取线程时所做的第一件事就是将线程的主体设置为HttpContext的主体。 这使校长同步。

但是,如果您稍后设置Thread的主体,则HttpApplication内部仍然具有用于用户上下文的不同主体集。 这就是为什么你应该总是通过HttpContext设置它。

(如果您查看Reflector,您可以看到在HttpContext.User上执行“set”时运行的复杂代码 – 它使用IIS执行大量内部操作以正确设置主体。)

这篇文章解释了吗?
http://www.hanselman.com/blog/CommentView.aspx?guid=22c42b73-4004-40ce-8af9-47f1b9b434ed

这是一段摘录:

我在ASP.NET自定义FormsAuthentication登录中有一些代码,如下所示:

 // This principal will flow throughout the request. VoyagerPrincipal principal = new VoyagerPrincipal(yada, yada, yada); // Attach the new principal object to the current HttpContext object HttpContext.Current.User = principal; 

它调用了Global.asax的AuthenticateRequest,所以一切都在Page的事件触发之前完成。 它提供了一个自定义IPrincipal,它将我们的eFinance Server与ASP.NET集成在一起。 这是一个非常可爱的子系统,恕我直言。

其他操作依赖于能够随时从当前线程获取此“调用上下文”IPrincipal。 在代码的另一部分中,有人在第一次调用上面的例程之后,在HttpRequest的MIDDLE中(在Page_Load中的某个地方)执行此操作:

 return Thread.CurrentPrincipal as VoyagerPrincipal; 

在有人调用第一个代码块然后希望能够在同一个HttpRequest中调用第二个块的情况下,Thread.CurrentPrincipal包含一个由HttpApplication更早填充的GenericPrincipal。 (或WindowsPrincipal,具体取决于您的设置)。