46

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

但是,当我添加此代码时,它不会构建。OnResultExecuting出现错误

“没有找到合适的方法来覆盖。”

public class XframeOptions : ActionFilterAttribute
{
    public override void OnResultExecuting(
          System.Web.Mvc.ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.AddHeader(
            "X-Frame-Options", "DENY");
    }
}

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

4

6 回答 6

142

如果每个页面都需要自定义 HttpModule 或 ActionFilter,则不需要它。 https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options详细介绍了一个更简单的解决方案:

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

<system.webServer>
  <!-- ... -->

  <httpProtocol>
    <customHeaders>
      <add name="X-Frame-Options" value="SAMEORIGIN" />
    </customHeaders>
  </httpProtocol>

  <!-- ... -->
</system.webServer>
于 2014-02-28T20:45:04.773 回答
14

确保您继承自correct class

public class XframeOptions : System.Web.Mvc.ActionFilterAttribute

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

System.Web.Http.Filters.ActionFilterAttribute
于 2013-05-10T14:27:55.793 回答
6

还有另一种方法可以做到这一点。创建一个自定义 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>
于 2013-12-26T08:32:18.330 回答
4

您收到此错误是因为您使用了错误的方法名称而不是OnResultExecutinguse 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");
    }
}
于 2013-12-26T07:30:20.553 回答
1

NWebsec 允许您通过 web.config、OWIN 中间件和/或 MVC 过滤器属性设置此安全标头和其他安全标头:https ://github.com/NWebsec/NWebsec/wiki

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

于 2015-06-17T10:32:51.223 回答
0

要将拒绝“x-frame-options”标头添加到所有 MVC 应用程序,您可以执行以下操作以避免 Clickjacking 攻击。

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

  <system.webServer>
    <modules>
      <add name="XfoHeader" type="Demo.Website.Modules.XfoHeaderModule" />
    </modules>
  </system.webServer>

在此处输入图像描述

于 2014-03-07T11:27:02.047 回答