我目前正在使用一些遗留代码,其中在MVC控制器方法中使用HttpContext.Current.User
属性来对当前用户执行一些基本授权。从阅读文档还有一个HttpContext.User
属性,它们似乎都表明他们可以获取/设置当前用户。我很好奇,如果在某些级别它们是可互换的和相同的,或者如果在授权或甚至识别Web应用程序的当前用户方面会导致意外问题的2之间存在关键差异。
答案 0 :(得分:2)
除了控制器内部之外,您不能直接引用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
相同。
答案 1 :(得分:1)
documentation解释了这一点(强调添加了,虽然这是指Web表单,但我相信MVC中的原理是相同的):
因为ASP.NET页面包含对System.Web的默认引用 namespace(包含HttpContext类),可以参考 不使用完全的.aspx页面上的HttpContext的成员 对HttpContext的限定类引用。例如,您可以使用 User.Identity.Name获取代表其的用户的名称 当前进程正在运行。
但是,如果你想使用的成员 来自ASP.NET代码隐藏模块的IPrincipal,您必须包含一个 引用模块中的System.Web命名空间和 a完全 对当前活动请求/响应的限定引用 上下文以及您要使用的System.Web中的类
例如, 在代码隐藏页面中,您必须指定完全限定名称 HttpContext.Current.User.Identity.Name。
答案 2 :(得分:1)
HttpContext.Current和HttpContext都与它为当前HTTP请求返回httpContext对象相同。
但是后者是控制器对象的属性,所以它只能在控制器中使用。