【问题标题】:In ASP.NET MVC 5, what method set the User object?在 ASP.NET MVC 5 中,用什么方法设置 User 对象?
【发布时间】:2017-07-26 17:21:12
【问题描述】:

我有一个使用多控制器继承的应用程序。我在继承的多个级别中覆盖了Initialize(RequestContext requestContext),但是每次我覆盖Initialize 方法时,我都会调用base.Initialize(requestContext);

[Authorize]
public class FirstBaseController: Controller
{
    protected override void Initialize(RequestContext requestContext)
    {
        base.Initialize(requestContext);
        // Set few custom global things
    }

}

public class SecondBaseController: FirstBaseController
{

    protected override void Initialize(RequestContext requestContext)
    {
        base.Initialize(requestContext);
        // At this point, I am expecting that the `User` object is already set by identity
        //check the claims value here.
    }
}

但是,如果我尝试从 Initialize 方法内部访问 User 对象,我发现它尚未设置!

框架在什么时间点设置User 对象?我可以覆盖操作方法之前的哪个方法已经设置了User 对象?

我不想在这里使用操作过滤器,因为我希望在每个请求上都执行此逻辑。

【问题讨论】:

  • 我很困惑。为什么您认为不是对每个请求都执行操作过滤器?
  • @ErikFunkenbusch 我不想手动为每个方法添加属性,除非有办法将它添加到所有方法中。 + 甚至可以从操作过滤器中访问User 对象吗?
  • 您可以通过HttpContext.Current.User 从操作过滤器访问用户对象。如果您查看实际的 MVC 源代码,您会看到控制器上的 User 属性只是从当前 http 上下文返回 User。
  • 另外,关于动作过滤器 - 您可以将它们应用到控制器,它们将应用于该控制器(或基类控制器,它们将应用于所有控制器上的所有方法)派生自该基类)
  • 有一种方法可以将其添加到所有方法中。您使用全局过滤器。见weblogs.asp.net/gunnarpeipman/…

标签: c# asp.net asp.net-mvc asp.net-mvc-5 controller


【解决方案1】:

这将根据您用于身份验证的方法而有所不同,但您应该可以安全地访问 `OnActionExecuting' 方法中的User

您还可以将其实现为动作过滤器并将该过滤器应用于每个控制器(或仅应用于基类控制器 - 它会“传递”到任何继承自它的控制器)

【讨论】:

    【解决方案2】:

    使用 JustDecompile 查看引用,User 属性确实向上导航到传递给 Initialize 的 RequestContext 引用(它具有对 HttpContext 的引用)。所以在Initialize中,如果传入方法的requestContext变量有一个属性HttpContext为null或者HttpContext.User引用为null,那么当前用户在Initialize()中是不可用的。

    OnActionExecuting 就像@Eric 所说的那样是个好地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-21
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2016-10-01
      • 2020-06-08
      • 2015-09-27
      • 1970-01-01
      相关资源
      最近更新 更多