ASP.Net 核心:X-Frame-Options 奇怪的行为

ASP.Net Core: X-Frame-Options strange behavior

我需要从我的一些应该呈现 iframe 内容的操作中删除 X-Frame-Options: SAMEORIGIN header。只要它默认添加到请求中,我就在 Startup.cs: services.AddAntiforgery(o => o.SuppressXFrameOptionsHeader = false); 中禁用了它。然后我写了一个简单的中间件:

    app.Use(async (context, next) =>
    {
        context.Response.Headers.Add("X-Frame-Options", "SAMEORIGIN");

        await next();
    });

响应 cross-domain 请求所需的操作使用结果过滤器属性修饰:

    public class SuppresXFrameOptionFilter : ResultFilterAttribute
    {
        public override async Task OnResultExecutionAsync(ResultExecutingContext context,
ResultExecutionDelegate next)
        {
            context.HttpContext.Response.Headers.Remove("X-Frame-Options");

            await next();
        }
    }

奇怪的事情来了。第一个 cross-domain 请求失败,因为尽管过滤器最终按预期工作,但 X-Frame-Options: SAMEORIGIN 仍然存在于响应中(我在中间件 next() 之后检查了它 - header重新出现)。如果我按 F5,header 不再出现在响应中,并且一切正常。只有 X-Frame-Options header 才会发生这种情况,一个自定义的被正确删除。 是什么让被删除的 X-Frame-Options 再次出现在响应中?

我会说在第一次请求时 Antiforgery 保存了 cookie,这意味着它还尝试设置 X-Frame-Options header.

如果您想在 Antiforgery 中禁用 header 并自己手动处理它,您需要将 SuppressXFrameOptionsHeader 设置为 true ;)

services.AddAntiforgery(o => o.SuppressXFrameOptionsHeader = true);