Моя система использует службу аутентификации на основе сеанса, где SessionContext передается в заголовках (
Код: Выделить всё
X-SessionЯ обсуждаю два подхода к обработке аутентификации и состояния сеанса:
Вариант 1: промежуточное программное обеспечение
- Чтение данных сеанса из заголовков в промежуточном программном обеспечении.
- Инициализация контекста аутентификации/сеанса в промежуточном программном обеспечении.
- Контроллер вызовов действие.
- Записать обновленные заголовки сеанса обратно в промежуточное ПО.
Код: Выделить всё
public class SessionContextMiddleware
{
private readonly RequestDelegate _next;
public SessionContextMiddleware(RequestDelegate next) => _next = next;
public async Task Invoke(HttpContext ctx, IServerAuthenticationService auth)
{
var raw = ctx.Request.Headers["X-Session"].FirstOrDefault();
await auth.InitializeAsync(raw);
await _next(ctx);
}
}
Код: Выделить всё
public class SessionContextCommitMiddleware
{
private readonly RequestDelegate _next;
public SessionContextCommitMiddleware(RequestDelegate next) => _next = next;
public async Task Invoke(HttpContext ctx, IServerAuthenticationService auth)
{
await _next(ctx);
var newState = await auth.CreateSessionData();
if (newState != null)
ctx.Response.Headers["X-Session"] = newState;
}
}
Код: Выделить всё
[HttpPost("create")]
public async Task Create(
[FromForm] Country country)
{
if (!ModelState.IsValid) return BadRequest(ModelState);
if (auth.IsForbidden) return Forbid();
var result = await countriesService.Create(country);
return Ok(result);
}
- Контроллеры остаются маленькими и чистыми.
- Централизованная обработка сеансов/аутентификации.
- Swagger/OpenAPI не отображает заголовки автоматически () в документации.
Код: Выделить всё
X-Session - Разработчики, читающие контроллер, не могут видеть, откуда берется сеанс/аутентификация (менее явно).
- Каждое действие контроллера получает строку [FromHeader] sessionData.
- Явно вызывает auth.InitializeAsync(sessionData) перед бизнес-логикой.
- Явно записывает обратно Response.Headers["X-Session"] = ... после бизнес-логики.
Код: Выделить всё
[HttpPost("create")]
public async Task Create(
[FromForm] Country country,
[FromHeader(Name = "X-Session")] string sessionData)
{
if (!ModelState.IsValid) return BadRequest(ModelState);
await auth.InitializeAsync(sessionData);
if (auth.IsForbidden) return Forbid();
var result = await countriesService.Create(country);
Response.Headers["X-Session"] = await auth.CreateSessionData();
return Ok(result);
}
- Полностью понятен и виден разработчикам.
- Swagger/OpenAPI автоматически документирует заголовки.
- Легко понять начинающим.
- Небольшое дублирование в каждом контроллере. (хотя они генерируются автоматически)
- Контроллеры теперь обрабатывают небольшую «инфраструктурную» логику.
- Контроллеры генерируются практически одинаково.
- Детализация/различия между конечными точками не требуются.
- Производительность не имеет значения (ввод-вывод). доминирует)
- Безопасность, удобство обслуживания и повторное использование уже контролируются сгенерированными сервисами.
Учитывая эти ограничения, что бы вы порекомендовали?
- Централизованная аутентификация/сессия в промежуточном программном обеспечении (чистые контроллеры, менее явные)
- Явный сеанс/аутентификация вызовы в каждом сгенерированном контроллере (прозрачные, совместимые с Swagger)
Подробнее здесь: https://stackoverflow.com/questions/798 ... ontrollers
Мобильная версия