Création de AuthorizeAttribute ASP.NET Core personnalisé

Dans ASP.NET Core MVC, l'autorisation est effectuée à l'aide de la classe AuthorizeAttribute
. Voici un exemple simple d'utilisation de l'autorisation basée sur les rôles:
[ Authorize ( Roles = "Admin, Moderator" ) ]
public classe AdminController : Controller
{
}
Les utilisateurs avec le rôle Admin
ou Moderator
auront accès aux actions du AdminController
.
Bien qu'il n'y ait rien de mal à cela et que cela fasse le travail, la chaîne "Admin, Moderator"
– comme vous pouvez l'imaginer – est une bonne recette pour une faute de frappe. Déplaçons donc les noms de rôle vers un ensemble de constantes de chaîne:
public static class RoleConstants
{
public const string Admin = "Admin" ;
public const string Moderator = "Moderator" ;
}
Le AdminController
devient désormais:
[ Authorize ( Roles = RoleConstants . Admin + "," + RoleConstants . Moderator ) ]
public class AdminController : Controller
{
}
Pas idéal, je sais. Malheureusement, nous ne pouvons pas utiliser de chaînes interpolées comme $ "{RoleConstants.Admin}, {RoleConstants.Moderator}"
avec des attributs.
C'est un bon exemple d'extension de AuthorizeAttribute
] classe a du sens. Puisque nous essayons de faciliter l'appel à une autorisation basée sur les rôles sur un contrôleur ou une action, créons un AuthorizeByRoleAttribute
:
public class AuthorizeByRoleAttribute : AuthorizeAttribute
{
public MyAuthorizeAttribute ( params string [] roles )
{
Rôles = Chaîne . Rejoindre ( "," rôles ) ;
}
}
Nous pouvons l'utiliser comme suit:
[ AuthorizeByRole ( RoleConstants . Admin RoleConstants . Moderator ) ]
public class AdminController : Controller
{
}
Tant mieux, non?
Si vous venez du framework complet ASP.NET MVC, vous saurez comment il était possible de remplacer les méthodes du AuthorizeAttribute
pour ajouter un comportement d'autorisation personnalisé. Vous ne pouvez pas faire cela dans ASP.NET Core. ( Source pour ASP.NET MVC | Source pour ASP.NET Core )
Si vous avez besoin d'un comportement d'autorisation personnalisé, utilisez les stratégies . Barry Dorrans (le «tsar» de la sécurité ASP.NET chez Microsoft) en parle dans un podcast 2017 .NET Rocks aux alentours de 30 minutes — cela vaut la peine d'être écouté si vous êtes intéressé par certains antécédents. [19659079] Conclusion
Personnaliser [Authorize]
en l'étendant est assez simple, mais n'a de sens que si vous essayez de rendre le code un peu plus maintenable. Pour un comportement personnalisé vous souhaitez utiliser les stratégies ASP.NET Core à la place.
Source link