J'essaie d'ajouter l'en-tête X-Frame-Options (avec une valeur définie sur "DENY") dans mon application MVC 4. J'ai regardé autour de moi et il semble this est le moyen le plus propre d'ajouter pour toutes les pages.
Cependant, lorsque j'ajoute ce code, il ne se construit pas. Avec une erreur sur OnResultExecuting
de
"aucune méthode appropriée n'a été trouvée pour remplacer."
public class XframeOptions : ActionFilterAttribute
{
public override void OnResultExecuting(
System.Web.Mvc.ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.AddHeader(
"X-Frame-Options", "DENY");
}
}
Si c'est le moyen le plus propre de le faire, comment puis-je résoudre cette erreur? Existe-t-il une meilleure façon de gérer cela dans une application MVC 4?
Assurez-vous que vous héritez de correct class
:
public class XframeOptions : System.Web.Mvc.ActionFilterAttribute
Dans ASP.NET MVC 4, il y a l'API Web qui a un espace de noms différent et puisque vous n'avez pas explicitement spécifié l'espace de noms, je suppose que le compilateur choisit la mauvaise classe:
System.Web.Http.Filters.ActionFilterAttribute
Il n'est pas nécessaire d'avoir un HttpModule ou un ActionFilter personnalisé si vous en avez besoin pour chaque page. https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options détaille une solution beaucoup plus simple:
Pour configurer IIS pour envoyer l'en-tête X-Frame-Options, ajoutez le fichier Web.config de votre site:
<system.webServer>
...
<httpProtocol>
<customHeaders>
<add name="X-Frame-Options" value="SAMEORIGIN" />
</customHeaders>
</httpProtocol>
...
</system.webServer>
Il existe une autre façon de procéder. créer un HttpModule personnalisé comme ci-dessous:
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");
}
}
puis enregistrez ce module dans web.config
<modules >
<add name ="XframeOptions" type="your module's full type info"/>
</modules>
Vous obtenez cette erreur car vous utilisez un nom de méthode incorrect au lieu de OnResultExecuting
utilisez OnResultExecuted
. Vous devez écrire votre méthode comme ceci:
public class XframeOptionsFilter : System.Web.Mvc.ActionFilterAttribute
{
public override void OnResultExecuted(System.Web.Mvc.ResultExecutedContext filterContext)
{
filterContext.HttpContext.Response.AddHeader("x-frame-options", "Deny");
}
}
NWebsec vous permet de définir ceci et d'autres en-têtes de sécurité via web.config, le middleware OWIN et/ou les attributs de filtre MVC: https://github.com/NWebsec/NWebsec/wiki
Avertissement: je suis le responsable du projet.
Pour ajouter un en-tête deny "x-frame-options" à toutes les applications MVC, vous pouvez procéder comme suit pour éviter une attaque 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");
}
}
}
Ajoutez ce qui suit au web.config
<system.webServer>
<modules>
<add name="XfoHeader" type="Demo.Website.Modules.XfoHeaderModule" />
</modules>
</system.webServer>