Решил. Как это всё делается? Внутрь onAuthenticationFailed вставляем этот код:
if (context.Exception?.GetType() == typeof(SecurityTokenExpiredException))
{
IJwtService jwtService = context.HttpContext.RequestServices.GetService<IJwtService>();
if (context.Request.Cookies.TryGetValue("refresh-token", out string refreshToken))
{
Result<ClaimsPrincipal> principalResult = jwtService.ValidateAndDecodeToken(refreshToken);
if (!principalResult.IsSuccess || principalResult.Value == null)
{
return Task.CompletedTask;
}
Result<string> renewAccessTokenResult = jwtService.Encode(principalResult.Value);
if (!renewAccessTokenResult.IsSuccess && renewAccessTokenResult.ValidationErrors.Any())
{
return Task.CompletedTask;
}
context.Response.Cookies.Append("access-token", renewAccessTokenResult.Value);
context.Response.StatusCode = 200;
context.HttpContext.User = principalResult.Value;
context.Principal = principalResult.Value;
context.Success();
}
}
return Task.CompletedTask;
Т.е.. вызывает сервис, берём
refresh token
и из него извлекаем
ClaimPrincipal
, далее на его основе делаем
access token
из того же сервиса и обрабатываем запрос, что бы он возвращал нужный статус. Как говорил
Andrei SunnyPh , это допустимая практика (Спасибо)