using System.Security.Claims; using Campaign_Tracker.Server.Authentication; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization.Policy; namespace Campaign_Tracker.Server.Authorization; public sealed class AuthorizationAuditResultHandler : IAuthorizationMiddlewareResultHandler { private readonly AuthorizationMiddlewareResultHandler _defaultHandler = new(); public async Task HandleAsync( RequestDelegate next, HttpContext context, AuthorizationPolicy policy, PolicyAuthorizationResult authorizeResult) { var auditStore = context.RequestServices.GetRequiredService(); if (authorizeResult.Forbidden) { auditStore.RecordAuthorizationDenied( GetActor(context.User), context.Request.Path, context.TraceIdentifier); } else if (authorizeResult.Challenged) { auditStore.RecordAuthorizationDenied( "anonymous", context.Request.Path, context.TraceIdentifier); } else if (authorizeResult.Succeeded) { auditStore.RecordAuthorizationAllowed( GetActor(context.User), context.Request.Path, context.TraceIdentifier); } await _defaultHandler.HandleAsync(next, context, policy, authorizeResult); } private static string GetActor(ClaimsPrincipal user) { return user.Identity?.Name ?? user.FindFirstValue(ClaimTypes.NameIdentifier) ?? "unknown"; } }