Как перехватить просроченный 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, и я понятия не имею, что из этого является корректным подходом. Прошу помощи