Промежуточное программное обеспечение аутентификации или явные заголовки в контроллерах, генерируемых анализатором – лучC#

Место общения программистов C#
Ответить
Anonymous
 Промежуточное программное обеспечение аутентификации или явные заголовки в контроллерах, генерируемых анализатором – луч

Сообщение Anonymous »

Я создаю серверный API Blazor WebAssembly с использованием ASP.NET Core, и все мои контроллеры генерируются автоматически с помощью анализаторов кода. Эти контроллеры очень тонкие, они существуют в основном для предоставления правильного интерфейса API, а не для хранения бизнес-логики.
Моя система использует службу аутентификации на основе сеанса, где 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
    ) в документации.
  • Разработчики, читающие контроллер, не могут видеть, откуда берется сеанс/аутентификация (менее явно).
Вариант 2 – явный в контроллерах:
  • Каждое действие контроллера получает строку [FromHeader] sessionData.
  • Явно вызывает auth.InitializeAsync(sessionData) перед бизнес-логикой.
  • Явно записывает обратно Response.Headers["X-Session"] = ... после бизнес-логики.
Контроллер (сгенерирован Source Анализатор)

Код: Выделить всё

[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)
Есть ли другие компромиссы, которые мне не хватает, особенно в отношении читабельности, документации OpenAPI и адаптации разработчиков?

Подробнее здесь: https://stackoverflow.com/questions/798 ... ontrollers
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»