【问题标题】:csp-report endpoint in asp.net coreasp.net 核心中的 csp-report 端点
【发布时间】:2019-11-30 11:14:56
【问题描述】:

我正在尝试在 asp.net 核心 webapp 中设置 CSP,并且 CSP 部分工作正常,我可以在浏览器控制台中看到违规行为,因为它们被发送到 report-uri 端点。

但是,我似乎无法在控制器中创建正确的方法来接收这些消息!

我在控制器中创建了一个方法:

[HttpPost]
[AllowAnonymous]
public IActionResult UriReport(CspReportRequest request)
{
    _log.LogError("CSP violation: " + request);
    return Ok();
}

它会被调用,但'request'参数始终为空。一些搜索显示我需要使用 [FromBody] 属性从正文中读取数据,但是一旦我将其放入,它就不再被调用。 (CspReportRequest 是一个属性与 csp-report 有效负载匹配的类,但它也不适用于字符串类型。)

因此,进一步阅读建议我为“application/csp-report”内容类型添加一个处理程序,将主体发送为:

services.Configure<MvcOptions>(options => {
    options.InputFormatters.OfType<JsonInputFormatter>().First().SupportedMediaTypes.Add(
        new MediaTypeHeaderValue("application/csp-report"));
});

但这似乎并没有什么不同。

那么 - 我如何制作正确的控制器签名和/或正确的服务处理程序选项来接收数据。

【问题讨论】:

标签: c# asp.net-core asp.net-core-2.0


【解决方案1】:

完成这项工作需要做两件事。第一个是将[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

public class JsonPatchInputFormatter : JsonInputFormatter

这是首先添加的,所以它是您正在配置的。它无法处理CspReportRequest 的实例,因为它有关于处理JsonPatchDocument&lt;T&gt; 等的特定规则,所以它传递给第二个JsonInputFormatter。正如我所提到的,第二个实例未配置为支持application/csp-report,因此它也无法处理请求。


1如果您使用的是[ApiController],则不需要使用[FromBody],但您的问题中的所有内容都表明您没有使用[ApiController]

2 在这里使用Last() 代替First() 不一定是最好的方法,但它应该能说明问题所在。有很多方法可以获得您感兴趣的特定JsonInputFormatter

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 2017-05-01
    • 2020-05-05
    • 1970-01-01
    • 2018-10-17
    • 2017-10-23
    相关资源
    最近更新 更多