仅针对特定控制器移除“X-Frame-Options”标头

5

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

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

不过,这似乎根本没有用。我在我的网站上唯一能使它发挥作用的方法是在global.asax下添加此代码。我相信我在ASP.NET MVC/IIS管道中错过了正确的步骤,允许我覆盖该标头的IIS设置。这可能吗?

protected void Application_EndRequest()
{
    Response.Headers.Remove("X-Frame-Options");
}

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

1个回答

5

OnResultExecuting 方法在 MVC 生命周期中发生得太早了,此时 header 还没有设置。

你需要的是在 View 渲染后运行的 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();
    }
}

我尝试了相同的方法,但好像没有起作用。在删除之前,我对filterContext.HttpContext.Response.Headers进行了快速监视,但只有两个标题ServerX-AspNetMvc-Version。你有什么想法吗? - Ammar Khan
1
我尝试将它与Sitecore一起使用,效果非常好! - Tillito

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接