如何在ActionFilter之后,在Action之前在ApiController中运行代码?

时间:2016-05-18 02:18:45

标签: asp.net-web-api2

我正在尝试实现IAuthenticationFilter( Web Api 2 风格,不是 MVC风格)并且我正在努力执行代码的顺序。我本来期望在任何基于控制器的东西之前运行身份验证过滤器,这样我就可以设置适当的主体,然后在某种基础ApiController中从我的DbContext加载相关的用户数据。

这是我追求的流程:

AuthenticationFilter ==> BaseController ==> Controller/Action
  1. AuthenticationFilter: - 测试授权标头,如果一切正常,则设置主体。

  2. BaseController: - 使用主体查找数据库中的完整用户记录并将其分配给protected属性。

  3. 控制器/操作: - 正常完成操作,可以访问 在BaseController中设置的用户记录。

  4. 我不确定将代码放在BaseController中的位置,以便在身份验证过滤器之后执行,但之前已解析的控制器/操作。< / p>

    问题

    所以我的问题是双重的:我是否以错误的方式解决这个问题?如果没有,我该如何执行第2步?

1 个答案:

答案 0 :(得分:3)

这是我最终做的事情。在我的BaseController中,我创建了一个名为LoggedInUser的受保护属性,并创建了一个特殊的getter:

private User _loggedInUser;
protected User LoggedInUser
{
    get
    {
        if (_loggedInUser != null) return _loggedInUser;

        var identity = RequestContext.Principal.Identity;
        var userId = identity.GetUserId();

        _loggedInUser = MyDbContext.Users.Find(userId);
        return _loggedInUser;
    }
}

这允许我将代码保存在一个地方,即BaseController,同时仍允许我推迟获取用户的尝试,直到认证发生为止。