xframeoptionheader - MVC 5区域特定的设置

本文关键字:设置 区域 MVC xframeoptionheader | 更新日期: 2023-09-27 17:54:27

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

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

  • 在MVC结构的"根"中有几个WebApiControllers
  • 两个"区域"-一个用于我的主站点(称为"App"),一个用于书签(称为"bookmarklet")

"App"是我的应用程序的主要区域。当用户点击Bookmarklet(无论他们在哪个网站)时,"Bookmarklet"会使页面出现在iFrame中。

我希望API和"应用程序"区域保护X-Frame-Options头,但是书签必须以来没有这个头的目的是要显示在iframe从任何网站(用户点击书签、打开iframe,预先填充表单保存当前页面的标题和URL——认为它是一个"加入收藏"功能,将你喜欢的链接保存在应用程序)。

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

<>之前Application_Start(){…AntiForgeryConfig。suppressxframeoptionheader = true;}之前

不幸的是,这会在所有区域抑制X-Frame-Options标头。是否有一种方法可以将此行为专门应用于Bookmarklet区域,而不是应用程序的根或其他区域?

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

xframeoptionheader - MVC 5区域特定的设置

您可以编写一个自定义属性来处理此场景:

[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
 }

使用此选项,您可以只在需要它的内容上抑制标题。