我正在尝试实现IAuthenticationFilter( Web Api 2 风格,不是 MVC风格)并且我正在努力执行代码的顺序。我本来期望在任何基于控制器的东西之前运行身份验证过滤器,这样我就可以设置适当的主体,然后在某种基础ApiController中从我的DbContext加载相关的用户数据。
这是我追求的流程:
AuthenticationFilter ==> BaseController ==> Controller/Action
AuthenticationFilter: - 测试授权标头,如果一切正常,则设置主体。
BaseController: - 使用主体查找数据库中的完整用户记录并将其分配给protected
属性。
控制器/操作: - 正常完成操作,可以访问 在BaseController中设置的用户记录。
我不确定将代码放在BaseController中的位置,以便在身份验证过滤器之后执行,但之前已解析的控制器/操作。< / p>
问题 所以我的问题是双重的:我是否以错误的方式解决这个问题?如果没有,我该如何执行第2步?
答案 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,同时仍允许我推迟获取用户的尝试,直到认证发生为止。