Mein System verwendet einen sitzungsbasierten Authentifizierungsdienst, bei dem ein SessionContext in Headern übergeben wird (
Code: Select all
X-SessionIch diskutiere zwei Ansätze für die Handhabung von Authentifizierung und Sitzungsstatus:
Option 1 – Middleware:
- Sitzungsdaten aus Headern in einer Middleware lesen.
- Authentifizierung/Sitzungskontext in Middleware initialisieren.
- Controller-Aktion aufrufen.
- Aktualisierte Sitzungsheader zurück in die Middleware schreiben.
Code: Select all
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);
}
}
Code: Select all
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;
}
}
Code: Select all
[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);
}
- Controller bleiben klein und sauber.
- Zentralisierte Sitzungs-/Authentifizierungsverwaltung.
- Swagger/OpenAPI zeigt nicht automatisch Header an () in der Dokumentation.
Code: Select all
X-Session - Entwickler, die den Controller lesen, können nicht sehen, woher Sitzung/Authentifizierung kommt (weniger explizit).
- Jede Controller-Aktion erhält [FromHeader]-String sessionData.
- Ruft explizit auth.InitializeAsync(sessionData) vor der Geschäftslogik auf.
- Schreibt Response.Headers["X-Session"] = ... explizit nach der Geschäftslogik zurück.
Code: Select all
[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);
}
- Vollständig explizit und für Entwickler sichtbar.
- Swagger/OpenAPI dokumentiert automatisch Header.
- Leicht für Junioren zu verstehen.
- Leichte Duplikate in jedem Controller (obwohl sie automatisch generiert werden).
- Controller verwalten jetzt eine kleine „Infrastruktur“-Logik.
- Controller werden generiert und sind nahezu identisch.
- Granularität/Unterschiede pro Endpunkt sind nicht erforderlich.
- Leistung ist kein Problem (E/A dominiert).
- Sicherheit, Wartbarkeit und Wiederverwendung werden bereits durch die generierten Dienste gesteuert.
Was würden Sie angesichts dieser Einschränkungen empfehlen?
- Zentralisierte Authentifizierung/Sitzung in Middleware (saubere Controller, weniger explizit)
- Explizite Sitzungs-/Authentifizierungsaufrufe in jedem generierten Controller (transparent, Swagger-freundlich)
Mobile version