namespace Backend.Security; public sealed class SecurityHeadersMiddleware(RequestDelegate next) { public async Task InvokeAsync(HttpContext context) { context.Response.OnStarting(() => { var headers = context.Response.Headers; headers["X-Content-Type-Options"] = "nosniff"; headers["X-Frame-Options"] = "DENY"; headers["Referrer-Policy"] = "strict-origin-when-cross-origin"; headers["Permissions-Policy"] = "camera=(), microphone=(), geolocation=()"; headers["Cross-Origin-Opener-Policy"] = "same-origin"; if (!headers.ContainsKey("Content-Security-Policy")) { headers["Content-Security-Policy"] = "default-src 'self'; " + "img-src 'self' data: https:; " + "font-src 'self' https://fonts.gstatic.com data:; " + "style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; " + "script-src 'self'; " + "connect-src 'self' https:; " + "frame-ancestors 'none'; " + "base-uri 'self'; " + "form-action 'self';"; } return Task.CompletedTask; }); await next(context); } }