我有从 BaseController 派生的WebAPI Controller ,而 BaseController 从AspNetCore's
Controller
每当他进入需要User
的端点时,我都想从数据库中加载[Authorize]
这是我的代码,其中if
中的条件是伪代码,因为我不知道如何检查此请求是否需要授权
public class DefaultController : Controller
{
protected readonly DatabaseContext _context;
protected readonly User _user;
public DefaultController(DatabaseContext context)
{
_context = context;
if (HttpContext.Request.RequiresAuthorization) // pseudo code
{
var id = User.FindFirst(ClaimTypes.NameIdentifier).Value;
_user = _context.Users.Find(id);
}
}
}
基本上,我希望避免在每个请求上加载用户,即使他不需要授权并且无法在该用户登录也可以。
是否有可能“全局地”实现,所以BaseController
是每个其他控制器派生的吗?
答案 0 :(得分:2)
您可以使用MvcOptions.Filters
在全球范围内注册您的授权过滤器。
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
options.Filters.Add(typeof(AuthorizationFilter));
});
}
由于您需要连接数据库,因此建议您通过扩展AuthorizationFilter
来创建自定义IAsyncAuthorizationFilter
public class AuthorizationFilter : IAsyncAuthorizationFilter
{
//use constructor to inject required dependencies
public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
//Move your custom logic here
}
}