Как перехватить просроченный access токен в конвейере обработки запросов, до того как клиенту будет отправлена 401?

Есть middleware, который должен перехватывать исключение SecurityTokenExpiredException, и обновлять access токен, если это возможно. Но в режиме отладки видно, что до блока catch дело не доходит. В Postman прилетает 401 и сообщение:

"Bearer error="invalid_token", error_description="The token expired at '11/24/2024 19:06:53'""

В конвейер обработки добавляю middleware в следующем порядке:

app.UseMiddleware<RefreshTokenExceptionHandler>();
app.UseAuthorization();

Сам класс обработчика:

public class RefreshTokenExceptionHandler 
{
    private readonly ITokenService tokenService;
    private readonly IServiceProvider serviceProvider;
private readonly RequestDelegate Next;
public RefreshTokenExceptionHandler(RequestDelegate next, ITokenService tokenService, IServiceProvider serviceProvider)
{
    this.tokenService = tokenService;
    this.serviceProvider = serviceProvider;
    Next = next;
}



public async System.Threading.Tasks.Task Invoke(HttpContext context)
{
    try
    {
        await Next(context);
    }
    catch (Exception ex)
    {
        if (ex is SecurityTokenExpiredException)
        {
            // Токен доступа истек. Пробуем обновить.
            await HandleRefreshTokenAsync(context);
        }
        else
        {
            // Передать исключение вниз по конвейеру обработки.
            throw;
        }
    }
}

Во время отладки

Видим, что следующим в конвейере идет Authorization, то есть по идее все верно...

Были мысли, что эту задачу следует решать не добавлением компонента в контейнер, а добавлением обработчика 401, и я понятия не имею, что из этого является корректным подходом. Прошу помощи


Ответы (0 шт):