【问题标题】:What is the difference between HttpContext.Current.User and HttpContext.UserHttpContext.Current.User 和 HttpContext.User 有什么区别
【发布时间】:2014-11-19 01:03:34
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net-mvc web


    【解决方案1】:

    您不能直接引用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

    【讨论】:

      【解决方案2】:

      documentation 解释了这一点(强调添加,虽然这是指 Web 表单,但我相信 MVC 中的原理是相同的):

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

      但是,如果您想使用 IPrincipal 来自 ASP.NET 代码隐藏模块,您必须包含一个 引用模块中的 System.Web 命名空间和 完全 对当前活动的请求/响应的合格引用 上下文和您要使用的 System.Web 中的类

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

      【讨论】:

        【解决方案3】:

        HttpContext.Current 和 HttpContext 都与为当前 HTTP 请求返回 httpContext 对象相同。
        但是后一个是控制器对象的属性,所以它只能在控制器中使用。

        【讨论】:

          猜你喜欢
          • 2013-05-17
          • 2010-12-23
          • 1970-01-01
          • 2010-10-02
          • 2011-12-12
          • 2010-09-16
          • 2012-03-14
          • 2012-02-06
          • 2011-02-25
          相关资源
          最近更新 更多