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

yam*_*pog 19 c# asp.net security genericprincipal

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

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

HttpContext.Current.User = myCustomPrincipal
//Thread.CurrentPrincipal = myCustomPrincipal
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

wom*_*omp 23

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

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

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

  • 对于阅读本文的任何人来说,请注意:即使您稍后设置 HttpContext.User,它似乎也不会将其复制到 Thread.CurrentPrincipal。至少对于我们的消息处理程序来说是这样。我们必须同时设置两者。 (2认同)

Are*_*ren 6

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

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

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

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


Eva*_*gle 5

这篇文章可以解释吗?

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;
Run Code Online (Sandbox Code Playgroud)

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

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

return Thread.CurrentPrincipal as VoyagerPrincipal;
Run Code Online (Sandbox Code Playgroud)

在有人调用第一个代码块然后希望能够在同一HttpRequest中调用第二个代码块的实例中,Thread.CurrentPrincipal包含一个由GenericHttpApplication填充的GenericPrincipal。(或WindowsPrincipal,取决于您的设置)。