我最近遇到了在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专家能否对这个问题有所了解?
答案 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,具体取决于您的设置。)