Как проверить, идет ли запрос к методу с атрибутом [Authorize]? - PullRequest
2 голосов
/ 24 мая 2019

У меня есть WebAPI Контроллер , производный от 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, из которого происходит любой другой контроллер?

1 Ответ

2 голосов
/ 24 мая 2019

Вы можете использовать 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...