2017-09-12 5 views
3

Je rencontre des problèmes avec les règles d'autorisation. J'ai un baseWebApiController avec une actionAttribut .NET core Authorize dans le contrôleur hérité

[HttpDelete("{id}"), Authorize(Policy = "Administrator")] 
public virtual async Task<IActionResult> Delete(int id) {} 

Mais dans un certain contrôleur qui hérite de ce qui précède, je veux donner accès aux utilisateurs aussi, avec une politique comme:

[HttpDelete("{id}"), Authorize(Policy = "All")] 
public override Task<IActionResult> Delete(int id){} 

Il semble les utilisateurs réguliers ne peuvent pas accéder à cette action. Dois-je chercher plus loin des erreurs dans ma configuration de politique, ou puisque le contrôleur est hérité, ses attributs sont-ils négligés?

Merci

Répondre

2

Le AuthorizeAttribute est un attribut qui est héritée et qui se permet d'être appliqué à plusieurs reprises.

Cela signifie que lors de l'héritage de votre méthode qui a déjà un AuthorizeAttribute, cela sera reporté. Ainsi, la définition de la fonction finale dans votre sous-classe ressemblerait à ceci:

[Authorize(Policy = "Administrator")] 
[Authorize(Policy = "All")] 
public override Task<IActionResult> Delete(int id) 

donc la route a maintenant deux politiques en place. C'est un peu un problème parce que les politiques sont conçues pour être cumulatives. Donc toutes les politiques doivent passer pour que l'authentification réussisse.

Bien sûr, cela ne fonctionnera pas pour vous parce que vous vouliez réellement "effacer" la politique d'origine de la classe de base. Cela n'est cependant pas possible, donc vous devrez supprimer la politique de la classe de base et peut-être introduire une deuxième classe réservée aux administrateurs pour ces politiques.

Le problème général ici est que votre conception de politique semble être basée sur rôles. Vous utilisez des stratégies, mais en réalité, vous vérifiez les rôles. Au lieu de cela, vous devriez envisager de travailler avec des exigences: Par exemple, pour supprimer quelque chose, un utilisateur devrait remplir l'exigence "DeletionAllowed". Cela permet un système de politique beaucoup plus précis. Et le gros avantage? Les gestionnaires d'exigences sont disjonctifs: un gestionnaire capable de répondre à l'exigence est donc suffisant pour le passer.