Je construis une API REST avec l'API .NET Core Web.Placement de l'autorisation dans la couche de service plutôt que dans la couche API Web
Mes contrôleurs simplement transmettre les demandes à la couche de service et de retourner le résultat
[HttpPost(nameof(Create))]
public async Task<Response<ProviderDTO>> Create([FromBody] ProviderDTO provider)
=> await providerService.CreateAsync(provider);
Je suis au point dans le système maintenant où je dois commencer à mettre en œuvre l'autorisation.
.NET Core a a lot of options pour mettre en œuvre l'autorisation, mais la documentation traite principalement de ces approches dans le contexte de la couche Web (où les contrôleurs vivent évidemment). Mon instinct me dit que je dois implémenter l'autorisation dans la couche de service elle-même, plutôt que de placer cette autorisation sur la couche Web.
Certains de mon raisonnement comprend:
- couche de service pourrait obtenir appelé par autre chose qu'un contrôleur (par exemple, les services d'appels d'autres services, qui ne seraient pas concernés à ce point avec autorisation) .
- L'autorisation de service peut être testée unitairement directement, plutôt que de devoir compter sur des tests d'intégration écrits pour chaque "couche" devant les services.
- Enregistre plusieurs appels dans la base de données - si j'ai besoin d'autoriser un document dans une exigence d'autorisation s'il est passé, je devrais retirer le même document plus tard dans le service.
Question Un
Serait-il une approche sensible et d'injecter IPrincipal
IAuthorizationService
dans mes services et de gérer l'autorisation directement là-dedans? Ensuite, la couche Web vérifierait purement simplement l'utilisateur est connecté, et peut-être des plus simples politiques attributs basés (c.-à ce contrôleur ne permet que la politique du personnel par exemple)
Question Deux
Est-ce que quelqu'un a des ressources dont ils ont pourrait me relier par (j'ai fait des recherches, mais il n'y a pas grand-chose là-bas à ce sujet)
PS: en ce qui concerne le rejet des demandes de la couche de service, j'ai un middleware de gestion des exceptions qui convertit des exceptions personnalisées pour les réponses HTTP. Ainsi, si une demande non autorisée se produit, je vais en lancer une pour une exception non autorisée qui aboutira finalement à un HTTP 403.