【问题标题】:How to run code in ApiController after AuthenticationFilter, before Action?如何在 AuthenticationFilter 之后、Action 之前在 ApiController 中运行代码?
【发布时间】:2016-05-18 02:18:44
【问题描述】:

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

这是我追求的流程:

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

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

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

我不确定将代码放在 BaseController 中的哪个位置以便让它在身份验证过滤器之后执行,但在解析控制器/操作之前之前

问题

所以我的问题有两个:我是不是走错了路?如果没有,我应该如何执行第 2 步?

【问题讨论】:

  • 使用AuthenticationFilter 中设置的主体正常获取操作中的完整用户记录。您可以在一个受保护的方法中检索它,该方法在调用时会提前调用。
  • 您能否展示一些代码来举例说明BaseController 以及在Controller/action 中的预期用途
  • @Nkosi 谢谢,那肯定行得通,但我希望避免在每一个动作中都这样做。

标签: asp.net-web-api2


【解决方案1】:

这就是我最终要做的。在我的 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,同时仍然允许我将获取用户的尝试推迟到进行身份验证之后。

【讨论】:

  • 当你提供你的答案时,我正在写我的答案。 :) 你也可以使用控制器的User 而不是RequestContext
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 2014-08-25
  • 2015-05-30
  • 1970-01-01
  • 2013-12-04
相关资源
最近更新 更多