HttpContext.Current.User 和 HttpContext.User 有什么区别?

本文关键字:HttpContext User 区别 什么 Current | 更新日期: 2023-09-27 18:30:59

我目前正在使用一些遗留代码,其中 HttpContext.Current.User 属性在 MVC 控制器方法中使用,以对当前用户执行一些基本授权。通过阅读文档,还有一个HttpContext.User属性,它们似乎都表明它们可以获取/设置当前用户。我很好奇它们是否在某些级别上是可互换的并且相同,或者两者之间是否存在关键差异,这会导致在授权甚至识别 Web 应用程序的当前用户方面出现意外问题。

HttpContext.Current.User 和 HttpContext.User 有什么区别?

您不能直接引用HttpContext.User,除非在控制器内部。 UserHttpContext 类的属性。你可以做这样的事情:

HttpContext context = HttpContext.Current;
IPrincipal user = context.User;

也就是说,可以通过 HttpContext 类的实例引用该属性。

Controller类具有一个名为 HttpContext 的属性。在控制器内部,如果你引用HttpContext.User,你就是在引用base.HttpContext.User,它通常(总是?)与HttpContext.Current.User是一回事,仅仅是因为base.HttpContext通常(也许总是?)与HttpContext.Current是一回事。

文档对此进行了解释(强调添加,虽然这是指 Web 表单,但我相信 MVC 中的原理是相同的):

因为 ASP.NET 页面包含对 System.Web 的默认引用命名空间(包含 HttpContext 类),您可以引用.aspx页面上的 HttpContext 成员,而不使用对 HttpContext 的限定类引用。例如,您可以使用User.Identity.Name 获取代表其当前进程正在运行。

但是,如果要使用在 ASP.NET 代码隐藏模块中,必须包含对模块中的 System.Web 命名空间的引用和完整的对当前活动请求/响应的限定引用上下文和 System.Web 中要使用的类

例如在代码隐藏页中,必须指定完全限定的名称HttpContext.Current.User.Identity.Name。

HttpContext.Current 和 HttpContext 都与它为当前 HTTP 请求返回 httpContext 对象相同。
但后者是控制器对象的属性,因此它仅在控制器中可用。