自从MVC4升级到MVC5以来,我注意到我的网页上添加了一个额外的服务器头:
X-Frame-Options:SAMEORIGIN
我理解添加此标记的安全性好处,但其中一个页面应包含在其他项目的iframe中(在其他域上),这个额外的标头阻止了这一点。
我已经确认它不是主机IIS7服务器添加标头,当我降级回MVC4时 - 标头消失了。
有谁知道如何从MVC5中删除此默认值?
答案 0 :(得分:88)
MVC5自动将HTTP标头X-Frame-Options添加到SAMEORIGIN
。这可以防止您的网站被加载到iframe
。
但我们可以在Application_Start
中的Global.asax.cs
中将其关闭。
示例强>
protected void Application_Start()
{
AntiForgeryConfig.SuppressXFrameOptionsHeader = true;
}
<强>更新强>
我写了一篇关于此MVC5 prevents your website being loaded in an IFRAME
的帖子答案 1 :(得分:4)
在Global.asax
中尝试这样的事情:
protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
{
HttpContext.Current.Response.Headers.Remove("X-Frame-Options");
}
编辑:
看看answer of Colin Bacon。它比我的更正确。
简而言之 - 如果您不想在IFRAME中运行您的网站,请不要删除此标头,因为它会打开伪造漏洞。但是,如果您仍想将其删除 - 请在AntiForgeryConfig.SuppressXFrameOptionsHeader = true;
中使用Application_Start
,这样做会更加清晰。
答案 2 :(得分:2)
这是HtmlHelper
类的替换扩展方法。它首先会清除所有 X-Frame-Options
标头,然后添加一个通常由内置X-Frame-Options
方法添加的AntiForgeryToken
标头。
此技术尊重SuppressXFrameOptionsHeader
设置,但在删除所有以前添加的X-Frame-Options
标头方面存在缺点,即使是SAMEORIGIN
以外的值也是如此。< / p>
public static MvcHtmlString AntiForgeryTokenSingleHeader(this HtmlHelper html)
{
string token = AntiForgery.GetHtml().ToString();
HttpResponseBase httpResponse = html.ViewContext.HttpContext.Response;
httpResponse.Headers.Remove("X-Frame-Options");
if (!AntiForgeryConfig.SuppressXFrameOptionsHeader)
{
httpResponse.AddHeader("X-Frame-Options", "SAMEORIGIN");
}
return new MvcHtmlString(token);
}
答案 3 :(得分:2)
如果你想要更多的灵活性,这里有一个ActionAttribute,它根据白名单添加/删除标题。如果引荐来源不在白名单中,则SAMEORIGIN标头将保留在原位。我打算粘贴代码,但SO抱怨长度。
https://long2know.com/2016/06/asp-net-anti-forgery-xframe-options/
答案 4 :(得分:0)
就我个人而言,在整个站点上禁用X-Frame-Options并不是一个好主意。我创建了一个ASP.NET MVC过滤器,该过滤器删除了此标头,而我只是将此过滤器应用于部分在iFrame中使用的网站的数量,例如小部件。
public class AllowDifferentOrigin : ActionFilterAttribute, IActionFilter
{
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.Headers.Remove("X-Frame-Options");
base.OnResultExecuted(filterContext);
}
}