c# - not - Agregar el encabezado X-Frame-Options a todas las páginas en la aplicación MVC 4
x-frame-options php (6)
Asegúrate de heredar de la correct class
:
public class XframeOptions : System.Web.Mvc.ActionFilterAttribute
En ASP.NET MVC 4 está la API web que tiene un espacio de nombres diferente y dado que no ha especificado explícitamente el espacio de nombres, supongo que el compilador está eligiendo la clase incorrecta:
System.Web.Http.Filters.ActionFilterAttribute
Estoy tratando de agregar el encabezado X-Frame-Options (con el valor establecido en "DENY") en mi aplicación MVC 4. Miré a mi alrededor y parece que this es la forma más limpia de agregar para todas las páginas.
Sin embargo, cuando agregue este código, no se compilará. Con un error en OnResultExecuting
of
"no se encontró ningún método adecuado para anular".
public class XframeOptions : ActionFilterAttribute
{
public override void OnResultExecuting(
System.Web.Mvc.ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.AddHeader(
"X-Frame-Options", "DENY");
}
}
Si esta es la forma más limpia de hacerlo, ¿cómo puedo resolver este error? ¿Hay una mejor manera de manejar esto en una aplicación MVC 4?
Hay otra manera de hacer eso. crea un HttpModule personalizado como a continuación:
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");
}
}
luego registra este módulo en web.config
<modules >
<add name ="XframeOptions" type="your module''s full type info"/>
</modules>
NWebsec le permite configurar este y otros encabezados de seguridad a través de web.config, middleware OWIN y / o atributos de filtro MVC: https://github.com/NWebsec/NWebsec/wiki
Descargo de responsabilidad: soy el mantenedor del proyecto.
No es necesario un HttpModule o ActionFilter personalizado si lo necesita para cada página. https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options detalla una solución mucho más simple:
Para configurar IIS para que envíe el encabezado X-Frame-Options, agregue el archivo Web.config de su sitio:
<system.webServer>
...
<httpProtocol>
<customHeaders>
<add name="X-Frame-Options" value="SAMEORIGIN" />
</customHeaders>
</httpProtocol>
...
</system.webServer>
Para agregar el encabezado denegar "x-frame-options" a todas las aplicaciones de MVC, puede hacer lo siguiente para evitar un ataque de 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");
}
}
}
Agregue lo siguiente a la web.config
<system.webServer>
<modules>
<add name="XfoHeader" type="Demo.Website.Modules.XfoHeaderModule" />
</modules>
</system.webServer>
OnResultExecuting
este error porque está utilizando el nombre de método incorrecto en lugar de OnResultExecuting
use OnResultExecuted
. Debes escribir tu método así:
public class XframeOptionsFilter : System.Web.Mvc.ActionFilterAttribute
{
public override void OnResultExecuted(System.Web.Mvc.ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.AddHeader("x-frame-options", "Deny");
}
}