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

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

Сообщение Anonymous »

Я создаю серверный API веб-сборки Blazor с использованием 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"] = ... после бизнес-логики.
Контроллер (сгенерированный анализатором исходного кода):

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

[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#»