MVC5:如何覆盖或更改特定视图的标题?

时间:2015-12-24 22:58:37

标签: asp.net-mvc

默认情况下,我的网站具有x-frame-options:启用了SAMEORIGIN标头。我想将其从特定视图中删除,以便只允许该视图托管在第三方iFrame中。

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

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:4)

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

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

另一种更简单的方法是从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();
}