Il y a un peu plus de 3 ans j’ai écrit l’article ASP.Net MVC : Appliquer globalement la protection anti-CSRF. Dans cet article j’ai émis la raison pour laquelle il est nécessaire d’appliquer globalement la protection contre les attaques CSRF pour toutes les requêtes HTTP utilisant la méthode POST. La raison est d’éviter au développeur tout oubli d’utilisation du filtre ValidateAntiForgeryToken
lorsqu’il code les actions des contrôleurs qui doivent recevoir des requêtes HTTP POST. Je vous conseille de lire l’article cité précédemment pour voir en détail comment est faite l’implémentation de ma solution permettant cette protection anti-CSRF centralisée lorsque votre projet utilise la technologie ASP.Net MVC.
Peut-on repliquer cette solution dans une application ASP.Net Core ?
La réponse à cette question est : non.
Plus besoin d’utiliser le code du fournisseur de filtres ValidateAntiForgeryTokenProvider
encore moins d’utiliser l’attribut DisableValidateAntiForgeryToken
(lire l’article cité plus haut pour voir à quoi servent ces classes). Ces classes ne sont plus utiles lorsque vous utilisez la technologie ASP.Net Core vu que cette dernière est venue avec des techniques plus ou moins identiques pour faire exactement pareil. C’est du code à retirer si vous êtes en train ou avez prévu de faire une migration d’une application utilisant ASP.Net MVC.
Les filtres AutoValidateAntiforgeryToken et IgnoreAntiforgeryToken
ASP.Net Core est venue avec de nouveaux attributs pour pallier ce manque qu’il y a avec ASP.Net MVC. En plus d’avoir toujours le filtre ValidateAntiForgeryToken
(un filtre du même nom existe déjà avec ASP.Net MVC), nous disposons de deux nouveaux filtres : AutoValidateAntiforgeryToken
et IgnoreAntiforgeryToken
dont les déclarations respectives sont les suivantes :
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple=false, Inherited=true)]
public class AutoValidateAntiforgeryTokenAttribute : Attribute, IFilterFactory, IOrderedFilter
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple=false, Inherited=true)]
public class IgnoreAntiforgeryTokenAttribute : Attribute, IOrderedFilter, IAntiforgeryPolicy
Il ne s’agit pas d’un fournisseur de filtres comme cela a été le cas dans la solution que j’ai écrite pour la technologie ASP.Net MVC. Nous avons à notre disposition le filtre AutoValidateAntiforgeryToken
qui ne s’occupe pas de valider uniquement les requêtes HTTP POST mais prend en compte toutes les méthodes HTTP à l’exception des méthodes GET, HEAD, OPTIONS et TRACE.
Ce filtre peut être appliqué :
- au niveau d’une ou plusieurs actions d’un contrôleur : à noter que cela n’apporte aucun plus par rapport à l’utilisation directe du filtre
ValidateAntiForgeryToken
. Pour rappel le but recherché dans cet article c’est d’éviter tout oubli du développeur de placer le filtre permettant de valider le token de validation anti-CSRF. - au niveau de la classe du contrôleur : étant donné qu’une application bien strcuturée contient très rarement un seul contrôleur alors le risque d’oubli cité dans le précédent point reste toujours présent.
- de façon globale à toute l’application : le risque lié à l’oubli du développeur est égal à zéro
Dans mes applications, vous l’aurez compris, je vais privilégier la configuration globale. Cette configuration se fait dans la méthode ConfigureServices
de la classe Startup
de notre application ASP.Net Core. Que notre projet suive le modèle d’application MVC ou le dernier né Razor Pages, la configuration se fera toujours via les options de la méthode AddMvc
comme ci-dessous :
services.AddMvc(options => options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute()));
Avec cette configuration centrale, les actions type POST pourront être écrites comme l’exemple de code ci-dessous où on note l’absence totale du filtre ValidateAntiForgeryToken
:
[HttpPost]
public async Task<IActionResult> Create(PersonViewModel model)
{
// [...]
}
Dans mon article parlant de l’application globale de la protection contre les attaques CSRF avec ASP.Net MVC j’avais inclus un attribut nommé DisableValidateAntiForgeryToken
qui permet de faire des exceptions pour certaines requêtes HTTP POST appliquées à des actions dont l’exécution n’est pas du tout risqué donc principalement des actions où on n’a pas besoin que l’utilisateur soit authentifié. Avec ASP.Net Core, l’attribut IgnoreAntiforgeryToken
permet de faire exactement pareil. Dans votre application ASP.Net Core, une fois la configuration globale de la protection anti-CSRF appliquée, il suffit juste de repertorier les actions à exclure et de les décorer avec le filtre IgnoreAntiforgeryToken
. Ci-dessous un exemple d’une action dans un contrôleur décorée de l’attribut IgnoreAntiforgeryToken
:
[HttpPost]
[IgnoreAntiforgeryToken]
public async Task<IActionResult> MonAction(MonViewModel model)
{
// [...]
}