2015-12-24 18 views
0

默认情况下,我的网站具有x-frame-options:启用SAMEORIGIN标头。我想从特定的视图中删除它,以允许该视图托管在第三方iFrame中。MVC5:如何覆盖或更改特定视图的标题?

public ActionResult Callback1() 
{ 
    // Remove the anti-clickjacking setting 
    Response.Headers.Remove("X-Frame-Options"); 

    Return View(); 
} 
// Does not remove the header 

public ActionResult Callback2() 
{ 
    // Try to override the setting 
    Response.Headers["X-Frame-Options"] = "ALLOW-FROM https://foo.com" 

    Return View(); 
} 
// Results in x-frame-options: ALLOW-FROM https://foo.com, SAMEORIGIN 

任何帮助,将不胜感激。

回答

2

如果您已在web.config中通过在system.webServer元素下添加customHeader启用了X-Frame-Options标头,则在操作方法中删除此标题将不起作用。因为即使您的代码从响应中删除头,IIS也会在将响应返回给浏览器之前将其添加回去。

对此的一个解决方案是创建一个自定义HttpModule,它检查url并从特定网页中删除此标头。您可以将此模块注入请求管道。

另一个更简单的方法是从web.config中删除设置并在代码中添加标头。你可以创建一个动作过滤器来做到这一点。

public class EnableSameOriginHeader : ActionFilterAttribute 
{ 
    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     filterContext.HttpContext.Response.AddHeader("X-Frame-Options", "SAMEORIGIN"); 
     base.OnActionExecuted(filterContext); 
    } 
} 

而对于所有要启用这个头,简单地用此过滤器装饰它的操作方法。

[EnableSameOriginHeader] 
public ActionResult Users() 
{ 
    return View(); 
} 

而您不希望启用此功能的人,请勿使用此筛选器进行修饰,并在其中添加自定义标题值。

public ActionResult SpecialView() 
{ 
    Response.Headers["X-Frame-Options"] = "ALLOW-FROM https://foo.com"; 
    return View(); 
} 
+0

谢谢。我接受了你的答案,但我翻转了这个解决方案并创建了2个过滤器。一个我在整个网站上启用SAMEORIGIN保护,另一个在必要时删除它。这样,如果我忘记将它应用到某个地方,我不会离开该网站。 –

+0

这似乎并没有做任何我已经发送页面/刷新和重定向,但没有写入页面,它不会重定向 – djack109