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

时间:2010-06-16 23:36:39

标签: c# asp.net security genericprincipal

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

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

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

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

我确实找到了一篇引人注目的帖子,但却没有任何解释来支持他的断言......

  

全部使用HttpConext.Current.User   web(ASPX / ASMX)应用程序。

     

对所有人使用Thread.CurrentPrincipal   其他应用程序,如winForms,   控制台和Windows服务   应用

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

3 个答案:

答案 0 :(得分:20)

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

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

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

答案 1 :(得分:6)

在webforms应用程序下,我相信Thread.CurrentPrincipal将成为运行工作进程(Thread)的主要负责人。

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

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

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

答案 2 :(得分:4)

本文是否解释了它? 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的事件触发之前进行所有设置。它提供了一个自定义   将我们的eFinance服务器与ASP.NET集成的IPrincipal。它的   相当可爱的子系统,恕我直言。

     

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

return Thread.CurrentPrincipal as VoyagerPrincipal;
     

在有人调用第一块代码的情况下   期望能够在同一个内部调用第二个块   HttpRequest,Thread.CurrentPrincipal包含一个GenericPrincipal   HttpApplication早就填充了。 (或者是   WindowsPrincipal,具体取决于您的设置。)