ASP.NET Core中CSP上报端点/cspreport POST返回404如何解决
问题根因
返回404的核心原因是路由配置不匹配,另外还有两处配置错误会导致后续功能异常,具体问题点如下:
- 接口路由不匹配:你将
CSPReport接口定义在HomeController中,未显式指定路由的情况下,默认MVC路由规则下该接口的实际访问路径是/Home/CSPReport,和CSP响应头中配置的上报地址/cspreport完全不一致,所有请求找不到对应端点就会返回404。 - 媒体类型配置不一致:接口的
[Consumes]特性配置的是application/cspreport,但JSON格式化器中添加支持的媒体类型是application/csp-report(中间多了连字符),即便路由修正后也会触发415不支持媒体类型错误。 - CSP策略字符串拼接缺分号:
img-src、font-src、connect-src三个指令末尾漏了分号,会导致后续指令拼接失效,无法正常触发拦截上报。
修复步骤
1. 修正CSP上报接口的路由和媒体类型配置
给Action显式绑定根路径路由,同时统一媒体类型配置:
[HttpPost("/cspreport")] [Consumes("application/csp-report")] public IActionResult CSPReport([FromBody] CspReportRequest cspReportRequest) { // 生产环境建议替换为结构化日志存储,不要仅输出到控制台 if (cspReportRequest?.CspReport != null) { Console.WriteLine($"CSP违规触发:文档地址{cspReportRequest.CspReport.DocumentUri},拦截资源地址{cspReportRequest.CspReport.BlockedUri},违规指令{cspReportRequest.CspReport.ViolatedDirective}"); } return Ok(); }
2. 修正CSP响应头的策略拼接
补全所有指令末尾遗漏的分号,避免策略解析失效:
context.Response.Headers.Add( "Content-Security-Policy-Report-Only", "default-src 'self' ;" + "script-src-elem 'self' ;" + "script-src 'self' ;" + "style-src-elem 'self' ;" + "img-src 'self' ;" + "font-src 'self' ;" + "media-src 'self' ;" + "frame-src 'self' ;" + "connect-src 'self' ;" + "object-src 'none' ;" + "base-uri 'self' ;" + "report-uri /cspreport ;" );
验证方式
- 启动项目后用Postman发送POST请求到
https://localhost:44331/cspreport,请求头设置Content-Type: application/csp-report,请求体传入符合CspReportRequest结构的JSON,会正常返回200状态码。 - 触发CSP违规后,浏览器上报请求会正常进入接口,控制台能输出对应的违规日志。
补充优化:现代浏览器已逐步废弃
report-uri指令,正式环境建议同时配置report-to指令搭配上报端点使用,兼容性更好。
内容的提问来源于stack exchange,提问作者Code4Fun
相关产品推荐
相关产品推荐

