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

时间:2016-02-17 19:44:06

标签: iframe asp.net-mvc-5 x-frame-options

我正在尝试使用以下命令删除特定控制器操作的“X-Frame-Options”标题:

physicsBody

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

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

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

1 个答案:

答案 0 :(得分:2)

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);
        }
    }
}

然后使用它,装饰你想要应用此滤镜的控制器或动作。

[RemoveXFrameOptions]
public class TestController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

public class TestController : Controller
{
    [RemoveXFrameOptions]
    public ActionResult Index()
    {
        return View();
    }
}