C# 向MVC4应用程序中的所有页面添加X-Frame-Options标题

C# 向MVC4应用程序中的所有页面添加X-Frame-Options标题,c#,asp.net-mvc,asp.net-mvc-4,http-headers,x-frame-options,C#,Asp.net Mvc,Asp.net Mvc 4,Http Headers,X Frame Options,我正在尝试将X-Frame-Options头(值设置为“DENY”)添加到我的MVC4应用程序中。我环顾四周,这似乎是为所有页面添加内容的最干净的方式 但是,当我添加此代码时,它将不会生成。在执行的结果时出现错误 “找不到可重写的合适方法。” 如果这是最干净的方法,如何解决此错误?在MVC 4应用程序中是否有更好的方法来处理此问题?请确保从以下继承: 在ASP.NET MVC 4中,有一个Web API具有不同的名称空间,由于您没有明确指定名称空间,我猜想编译器选择了错误的类: System.W

我正在尝试将X-Frame-Options头(值设置为“DENY”)添加到我的MVC4应用程序中。我环顾四周,这似乎是为所有页面添加内容的最干净的方式

但是,当我添加此代码时,它将不会生成。在执行的结果时出现错误

“找不到可重写的合适方法。”


如果这是最干净的方法,如何解决此错误?在MVC 4应用程序中是否有更好的方法来处理此问题?

请确保从以下继承:

在ASP.NET MVC 4中,有一个Web API具有不同的名称空间,由于您没有明确指定名称空间,我猜想编译器选择了错误的类:

System.Web.Http.Filters.ActionFilterAttribute

出现此错误是因为您使用了错误的方法名称,而不是
OnResultExecuting
use
OnResultExecuted
。 您应该这样编写您的方法:

public class XframeOptionsFilter : System.Web.Mvc.ActionFilterAttribute
{
    public override void OnResultExecuted(System.Web.Mvc.ResultExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.AddHeader("x-frame-options", "Deny");
    }
}

还有另一种方法。创建自定义HttpModule,如下所示:

    public class XframeOptionsModule : IHttpModule
{
    public void Dispose()
    {

    }

    public void Init(HttpApplication context)
    {
        context.PreSendRequestHeaders += this.OnPreSendRequestHeaders;
    }
    private void OnPreSendRequestHeaders(object sender, EventArgs e)
    {
        HttpContext.Current.Response.AddHeader("x-frame-options", "Deny");
    }
}
然后在web.config中注册此模块

    <modules >
        <add name ="XframeOptions" type="your module's full type info"/>
    </modules>
  <system.webServer>
    <modules>
      <add name="XfoHeader" type="Demo.Website.Modules.XfoHeaderModule" />
    </modules>
  </system.webServer>

如果每个页面都需要自定义HttpModule或ActionFilter,则不需要它。详细介绍了一个更简单的解决方案:

要将IIS配置为发送X-Frame-Options标头,请在网站的Web.config文件中添加以下内容:


要在所有MVC应用程序中添加拒绝“x-frame-options”标题,您可以执行以下操作以避免点击劫持攻击

using System;
using System.Web;

namespace Demo.Website.Modules
{
    public class XfoHeaderModule : IHttpModule
    {
        public void Init(HttpApplication context)
        {
            context.PreSendRequestHeaders += ContextPreSendRequestHeaders;
        }

        public void Dispose()
        {
        }

        private void ContextPreSendRequestHeaders(object sender, EventArgs e)
        {
            HttpContext.Current.Response.Headers.Add("X-Frame-Options", "Deny");
        }
    }
}
将以下内容添加到web.config

    <modules >
        <add name ="XframeOptions" type="your module's full type info"/>
    </modules>
  <system.webServer>
    <modules>
      <add name="XfoHeader" type="Demo.Website.Modules.XfoHeaderModule" />
    </modules>
  </system.webServer>


NWebsec允许您通过web.config、OWIN中间件和/或MVC筛选器属性设置此安全头和其他安全头:


免责声明:我是该项目的维护者。

再次感谢,就是这样。最好远离PreSendRequestHeaders事件,因为它已被弃用。请参阅:屏幕截图中的响应有2个X-Frame-Options标题。这是一个更合适的答案。不需要代码,只需配置这是最好的解决方案。您好,我刚刚将代码添加到my web.config源文件中。但是在运行程序之后,我在Chrome测试工具上看不到X-Frame选项。我错过了什么吗?在重新启动IIS/IIS Express之后,您是否重新启动了它?理论上,这是没有必要的,因为当你更改web.config时,IIS倾向于循环使用,但我之前一直在假设。这是最简单的解决方案,这对我有效,但在中设置属性不起作用。这不是我第一次在system.webServer中设置似乎被忽略。为什么会这样?但标准.Net允许您通过web.config…设置此安全头和其他安全头。。。?