You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

51 line
1.6KB

  1. using System.Security.Claims;
  2. using Campaign_Tracker.Server.Authentication;
  3. using Microsoft.AspNetCore.Authorization;
  4. using Microsoft.AspNetCore.Authorization.Policy;
  5. namespace Campaign_Tracker.Server.Authorization;
  6. public sealed class AuthorizationAuditResultHandler : IAuthorizationMiddlewareResultHandler
  7. {
  8. private readonly AuthorizationMiddlewareResultHandler _defaultHandler = new();
  9. public async Task HandleAsync(
  10. RequestDelegate next,
  11. HttpContext context,
  12. AuthorizationPolicy policy,
  13. PolicyAuthorizationResult authorizeResult)
  14. {
  15. var auditStore = context.RequestServices.GetRequiredService<IAuthenticationAuditStore>();
  16. if (authorizeResult.Forbidden)
  17. {
  18. auditStore.RecordAuthorizationDenied(
  19. GetActor(context.User),
  20. context.Request.Path,
  21. context.TraceIdentifier);
  22. }
  23. else if (authorizeResult.Challenged)
  24. {
  25. auditStore.RecordAuthorizationDenied(
  26. "anonymous",
  27. context.Request.Path,
  28. context.TraceIdentifier);
  29. }
  30. else if (authorizeResult.Succeeded)
  31. {
  32. auditStore.RecordAuthorizationAllowed(
  33. GetActor(context.User),
  34. context.Request.Path,
  35. context.TraceIdentifier);
  36. }
  37. await _defaultHandler.HandleAsync(next, context, policy, authorizeResult);
  38. }
  39. private static string GetActor(ClaimsPrincipal user)
  40. {
  41. return user.Identity?.Name ??
  42. user.FindFirstValue(ClaimTypes.NameIdentifier) ??
  43. "unknown";
  44. }
  45. }

Powered by TurnKey Linux.