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

时间:2014-11-19 01:03:34

标签: c# asp.net-mvc web

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

3 个答案:

答案 0 :(得分:2)

除了控制器内部之外,您不能直接引用HttpContext.UserUserHttpContext类的属性。你可以这样做:

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对象相同。
但是后者是控制器对象的属性,所以它只能在控制器中使用。