我正在尝试在asp.net核心web应用程序中设置CSP,并且CSP部分工作正常,当将违规发送到report-uri端点时,我可以在浏览器控制台中看到它们。
但是,我似乎无法在 Controller 中创建正确的方法来接收这些消息!
我在 Controller 中创建一个方法为:
[HttpPost]
[AllowAnonymous]
public IActionResult UriReport(CspReportRequest request)
{
_log.LogError("CSP violation: " + request);
return Ok();
}
它将被调用,但“request”参数始终为null。一些搜索显示,我需要使用[FromBody]属性从主体读取数据,但是一旦将其放入,就不再被调用。
(CspReportRequest是一个具有与csp-report有效负载匹配的属性的类,但它也不适用于字符串类型。)
因此,进一步阅读建议我为主体发送的“application/csp-report”内容类型添加一个处理程序:
services.Configure<MvcOptions>(options => {
options.InputFormatters.OfType<JsonInputFormatter>().First().SupportedMediaTypes.Add(
new MediaTypeHeaderValue("application/csp-report"));
});
但这似乎没有什么不同。
所以-我如何做出正确的 Controller 签名和/或正确的服务处理程序选项以接收数据。
最佳答案
要完成此工作,需要做两件事。首先是将[FromBody]
添加到CspReportRequest request
参数1:
public IActionResult UriReport([FromBody] CspReportRequest request)
如果没有
[FromBody]
,则JsonInputFormatter
将不会用于解析请求正文。但是,使用[FromBody]
,您将开始看到415
响应。第二件事是配置
JsonInputFormatter
以支持application/csp-report
媒体类型,您已经尝试这样做。您的方法的问题在于实际上配置了两个JsonInputFormatter
实例,并且您正在影响一个错误的实例。如果您只是从First()
更改为Last()
2,它应该可以工作。为什么?集合中的第一个
JsonInputFormatter
实际上是 JsonPatchInputFormatter
的一个实例,它扩展了JsonInputFormatter
:它首先被添加,因此它就是您要配置的。它无法处理
CspReportRequest
实例,因为它具有有关处理JsonPatchDocument<T>
等的特定规则,因此它会传递到第二个JsonInputFormatter
。如前所述,第二个实例未配置为支持application/csp-report
,因此它也无法处理该请求。1如果您使用的是
[ApiController]
,则不需要使用[FromBody]
,但是问题中的所有内容都表明您没有使用[ApiController]
。2在这里使用
Last()
而不是First()
不一定是最好的方法,但是它应该证明问题出在哪里。有很多方法可以获取您感兴趣的特定JsonInputFormatter
。关于c# - asp.net核心中的csp-report端点,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57146684/