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); } } }