加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-web-api2 – 如何在ActionFilter之后,在Action之前在Api

发布时间:2020-12-16 09:56:00 所属栏目:asp.Net 来源:网络整理
导读:我正在尝试实现IAuthenticationFilter(Web Api 2风格,而不是MVC风格),我正在努力执行代码的顺序.我希望在任何基于控制器的东西之前运行身份验证过滤器,这样我就可以设置适当的主体,然后在某种基础ApiController中从我的DbContext加载相关的用户数据. 这是我
我正在尝试实现IAuthenticationFilter(Web Api 2风格,而不是MVC风格),我正在努力执行代码的顺序.我希望在任何基于控制器的东西之前运行身份验证过滤器,这样我就可以设置适当的主体,然后在某种基础ApiController中从我的DbContext加载相关的用户数据.

这是我追求的流程:

AuthenticationFilter ==> BaseController ==> Controller/Action

> AuthenticationFilter: – 测试授权标头,如果一切正常,则设置主体.
> BaseController: – 使用principal来查找数据库中的完整用户记录并将其分配给受保护的属性.
>控制器/动作: – 正常完成动作,可以访问
在BaseController中设置的用户记录.

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

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

解决方法

这就是我最终做的事情.在我的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中,同时仍然允许我推迟获取用户的尝试,直到进行身份验证.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读