0

我正在尝试为我的应用程序中的 X-Frame-Options 标头创建特定于区域的行为。

我有一个具有以下结构的 MVC 5 项目:

  • MVC结构的“根”中的几个WebApiController
  • 两个“区域”——一个用于我的主站点(称为“应用程序”),一个用于书签(称为“书签”)

“应用程序”是我的应用程序的主要区域。每当用户单击书签时,“书签”会导致页面出现在 iFrame 中(无论他们在哪个站点上)。

我希望 API 和“应用程序”区域受 X-Frame-Options 标头保护,但 Bookmarklet 不能有此标头,因为它的目的是显示在任何网站的 iframe 内(用户单击小书签,它会打开 iframe 并预填充一个表单以保存当前页面的标题和 URL - 将其视为“添加到收藏夹”功能,可将您喜欢的链接保存在应用程序中)。

我目前在 Global.asax 中使用以下内容:

    受保护的无效 Application_Start()
    {
        ...

        AntiForgeryConfig.SuppressXFrameOptionsHeader = true;                       
    }

不幸的是,这会抑制所有区域的 X-Frame-Options 标头。有没有办法将此行为专门应用于书签区域而不是应用程序的根或其他区域?

请注意,我知道与打开 X-Frame-Options 相关的点击劫持安全风险。我试图通过将登录功能放置在网站的“应用程序”区域(我想用 X-Frame-Options 保护)来降低这种风险。“书签”功能(不能被 X-Frame-Options 保护,因为它可以从用户访问的任何站点打开)因此只包含有限的数据输入。

4

1 回答 1

2

您可以编写自定义属性来处理这种情况:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class SuppressHeadersAttribute : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        //suppress headers here
        //filterContext has access to the HttpContext
    }
}

然后让您需要遵循此模式的控制器从具有此属性的基本控制器继承。

 [SuppressHeader]
 public class BaseController : Controller
 {
 }

 public class YourController : BaseController
 {
     //Do Stuff
 }

使用它,您可以仅在需要它的东西上抑制标题。

于 2014-03-28T17:53:35.873 回答