HttpContext.Current.User 和 HttpContext.User 有什么区别?
本文关键字:HttpContext User 区别 什么 Current | 更新日期: 2023-09-27 18:30:59
我目前正在使用一些遗留代码,其中 HttpContext.Current.User
属性在 MVC 控制器方法中使用,以对当前用户执行一些基本授权。通过阅读文档,还有一个HttpContext.User
属性,它们似乎都表明它们可以获取/设置当前用户。我很好奇它们是否在某些级别上是可互换的并且相同,或者两者之间是否存在关键差异,这会导致在授权甚至识别 Web 应用程序的当前用户方面出现意外问题。
您不能直接引用HttpContext.User
,除非在控制器内部。 User
是 HttpContext
类的属性。你可以做这样的事情:
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 对象相同。
但后者是控制器对象的属性,因此它仅在控制器中可用。