using APP_LOGGING.Accessories.LoggingAccessories;
using Microsoft.AspNetCore.Antiforgery;
using Microsoft.AspNetCore.Http;
namespace APP_UTILITIES.Middleware;
///
/// Обработчик службы против подделки запросов
///
public class AntiforgeryMiddleware
{
///
/// Делегат на передачу действия следующему в роутере
///
private RequestDelegate Next { get; }
///
/// API для настройки функций против подделки
///
private IAntiforgery Antiforgery { get; }
///
/// Конструктор
///
/// Делегат на передачу действия следующему в роутере
/// API для настройки функций против подделки
public AntiforgeryMiddleware(RequestDelegate next, IAntiforgery antiforgery)
{
Next = next;
Antiforgery = antiforgery;
}
///
/// Асинхронный обработчик запроса
///
/// Контекст запроса
///
public async Task InvokeAsync(HttpContext context)
{
try
{
//генерируем токен против подделки запросов
var tokens = Antiforgery.GetAndStoreTokens(context);
//устанавливаем токен в куку
context.Response.Cookies.Append("CSRF-TOKEN", tokens.RequestToken ?? string.Empty, new CookieOptions { HttpOnly = false });
}
catch (Exception exception)
{
//логируем исключение
exception.LogException();
}
finally
{
//передаем управление на следующий метод в роутере что бы был вывод/перенаправление ошибки
await Next.Invoke(context);
}
}
}