NetCoreTemplate/APP_UTILITIES/Middleware/AntiforgeryMiddleware.cs
Dvurechensky c99c7eaa9f 1.0.0
Full All
2025-03-02 08:59:35 +03:00

61 lines
2.1 KiB
C#

using APP_LOGGING.Accessories.LoggingAccessories;
using Microsoft.AspNetCore.Antiforgery;
using Microsoft.AspNetCore.Http;
namespace APP_UTILITIES.Middleware;
/// <summary>
/// Обработчик службы против подделки запросов
/// </summary>
public class AntiforgeryMiddleware
{
/// <summary>
/// Делегат на передачу действия следующему в роутере
/// </summary>
private RequestDelegate Next { get; }
/// <summary>
/// API для настройки функций против подделки
/// </summary>
private IAntiforgery Antiforgery { get; }
/// <summary>
/// Конструктор
/// </summary>
/// <param name="next">Делегат на передачу действия следующему в роутере</param>
/// <param name="antiforgery">API для настройки функций против подделки</param>
public AntiforgeryMiddleware(RequestDelegate next, IAntiforgery antiforgery)
{
Next = next;
Antiforgery = antiforgery;
}
/// <summary>
/// Асинхронный обработчик запроса
/// </summary>
/// <param name="context">Контекст запроса</param>
/// <returns></returns>
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);
}
}
}