【问题标题】:log request for "CORS policy execution failed"“CORS 策略执行失败”的日志请求
【发布时间】:2021-01-17 05:45:47
【问题描述】:

我的 ASP.NET Core 3.0 中的特定配置/部署日志:

[INF] CORS 策略执行失败。
[INF] 请求来源https://bla.com 无权访问资源

当时我如何记录请求调试的资源

(注意这个问题不是关于实际问题或解决问题)
(请注意,我不是在全局提高日志级别等之后)

【问题讨论】:

  • 也许您可以尝试在 appsettings.json 文件和 appsettings.Development.json 文件中将 log level 设置为 Trace 以获取更多日志详细信息。
  • 带有自定义属性或中间件(在CORS的中间件之前)
  • @krlosmederos - 怎么样?
  • 用自定义中间件替换默认的 cors 中间件。更多信息在这里andrewlock.net/a-deep-dive-in-to-the-asp-net-core-cors-library
  • 您能与我们分享一些 CORS 策略/配置代码吗?

标签: asp.net-core asp.net-core-3.0 asp.net-core-3.1


【解决方案1】:

嗯,那个中间件被锁得很厉害,我还没有找到任何明智的方法来挂钩它。

如果你想替换CorsMiddleware,你不能只在中间件上创建一个调用Invoke()的装饰器,因为你不知道发生了什么。

另一种解决方案可能是将服务集合中的CorsService:ICorsService 注册替换为装饰器,然后在将调用委托给EvaluatePolicy() 后检查CorsResult。这样,您可以在发出原始消息的位置附近发出额外的日志消息。

但是还有另一种可能的解决方案,既非常简单又非常粗略:检查请求中发生了什么。尽管这与原始记录的消息有点远。

下面的代码是一个添加到管道的委托(在启动/配置中,在.UseCors() 之前),它检查请求是否是预检请求(与CorsService 相同),以及它是否成功,即AccessControlAllowOrigin 标头存在。如果不成功,它会记录一条消息,其EventId 和来源与CorsService 相同。

app.Use(async (ctx, next) =>
{
    await next();

    var wasPreflightRequest = HttpMethods.IsOptions(ctx.Request.Method) 
        && ctx.Request.Headers.ContainsKey(CorsConstants.AccessControlRequestMethod);
    var isCorsHeaderReturned = ctx.Response.Headers.ContainsKey(HeaderNames.AccessControlAllowOrigin);

    if (wasPreflightRequest && !isCorsHeaderReturned)
    {
        ctx.RequestServices.GetRequiredService<ILoggerFactory>()
            .CreateLogger<CorsService>()
            .LogInformation(new EventId(5, "PolicyFailure"),
                $"CORS preflight failed at resource: {ctx.Request.Path}.");
    }
});

根据我的测试,它似乎有效。 ¯\_(ツ)_/¯

它可能不是你要找的东西,但谁知道呢,也许它会对某人有用。

(显然,处理这些事情的一个好方法是使用 结构化日志记录 解决方案,如 Serilog,并添加丰富器以捕获额外的请求信息,或手动添加内容到诊断上下文。但设置起来要复杂得多。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 2021-02-28
    • 2022-06-15
    • 2017-01-15
    • 2019-11-30
    • 2019-10-01
    • 1970-01-01
    • 2021-03-11
    相关资源
    最近更新 更多