19

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

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

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

我很高兴我把错误排除在外,但它引出了一个问题“这两种设置委托人的方法有什么区别?”。还有其他与差异相关的 stackoverflow问题,但它们没有涉及这两种方法的细节。

我确实找到了一篇引人入胜的帖子,其中包含以下宏大的评论,但没有任何解释来支持他的断言……

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

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

你们中的任何一个安全/dot.net 专家都可以对这个主题有所了解吗?

4

3 回答 3

25

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

但是,如果您稍后再设置 Thread 的主体,则 HttpApplication 在内部仍然为用户上下文设置不同的主体。这就是为什么您应该始终通过 HttpContext 设置它的原因。

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

于 2010-06-16T23:56:12.140 回答
7

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

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

在表单/wpf 应用程序的情况下,这是有道理的,因为您运行应用程序的用户是您感兴趣的用户。

您是在尝试伪装工作进程还是登录用户?

于 2010-06-16T23:46:33.630 回答
5

这篇文章有解释吗?

http://www.hanselman.com/blog/CommentView.aspx?guid=22c42b73-4004-40ce-8af9-47f1b9b434ed

这是一段摘录:

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

// 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 上调用,因此一切都在页面事件触发之前设置完毕。它提供了一个自定义的 IPrincipal,将我们的 eFinance Server 与 ASP.NET 集成在一起。这是一个非常可爱的子系统,恕我直言。

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

return Thread.CurrentPrincipal as VoyagerPrincipal;

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

于 2010-06-16T23:50:22.650 回答