仅删除特定控制器的“X-Frame-Options”标头

rya*_*lit 5 iframe x-frame-options asp.net-mvc-5

我正在尝试使用以下方法删除仅针对特定控制器操作的“X-Frame-Options”标头:

protected override void OnResultExecuting(ResultExecutingContext filterContext)
{
    filterContext.HttpContext.Response.Headers.Remove("X-Frame-Options");
    base.OnResultExecuting(filterContext);
}
Run Code Online (Sandbox Code Playgroud)

然而,这似乎根本不起作用。我可以让它在我的网站上正常工作的唯一方法是将此代码添加到下面的 global.asax 中。我很确定我在 ASP.NET MVC / IIS 管道中缺少正确的步骤,该步骤允许我覆盖该标头的 IIS 设置。这可能吗?

protected void Application_EndRequest()
{
    Response.Headers.Remove("X-Frame-Options");
}
Run Code Online (Sandbox Code Playgroud)

至于我为什么要这样做,我正在构建一个小部件,用户可以通过使用 iframe 在他们的个人网站上使用该小部件,但允许他们将信息发回我们的网站。我意识到关闭此标头会带来安全隐患,虽然我欢迎任何有关如何减轻这些风险的建议,但我只是想知道我所要求的是否可行。

小智 5

OnResultExecuting在 MVC 生命周期中发生得太早。标题尚未设置。

您需要的是在渲染视图后运行的OnResultExecuted方法。

以下是为您要查找的内容编写过滤器类的方法:

using System.Web.Mvc;

namespace Test.Filters
{
    public class RemoveXFrameOptionsAttribute : ActionFilterAttribute
    {
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            filterContext.HttpContext.Response.Headers.Remove("X-Frame-Options");
            base.OnResultExecuted(filterContext);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后要使用它,请装饰您想要应用此过滤器的任何控制器或操作。

[RemoveXFrameOptions]
public class TestController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者

public class TestController : Controller
{
    [RemoveXFrameOptions]
    public ActionResult Index()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)