2016-02-17 25 views
1

我想刪除「X-框架 - 選項」頭只使用一個特定的控制器的動作:刪除「X-框架 - 選項」頭爲特定的控制器只

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的其個人網站上使用,而且讓他們的信息發佈到我們的網站。我意識到將這個標題關掉會帶來安全隱患,雖然我歡迎任何有關如何緩解這些風險的建議,但我只想知道我所問的是否可能。

回答

0

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