Удаление заголовка X-Frame-Options только для определенного контроллера

Я пытаюсь удалить заголовок «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, но позволять им отправлять информацию на наш сайт. Я понимаю, что отключение этого заголовка имеет последствия для безопасности, и хотя я приветствую любые предложения о том, как снизить эти риски, я просто хочу знать, возможно ли то, о чем я прошу.


person ryanulit    schedule 17.02.2016    source источник


Ответы (1)


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

or

public class TestController : Controller
{
    [RemoveXFrameOptions]
    public ActionResult Index()
    {
        return View();
    }
}
person Binh Le    schedule 11.08.2016
comment
Я пробовал то же самое, но, похоже, не работает. Кроме того, перед удалением сделал Quick Watch на filterContext.HttpContext.Response.Headers, но только 2 заголовка представлены Server и X-AspNetMvc-Version. Какие-нибудь мысли? - person Ammar Khan; 26.02.2019
comment
Я попробовал это вместе с sitecore, и это сработало как шарм! - person Tillito; 10.04.2019