J'ai une application ASP.NET MVC en utilisant les attributs d'autorisation sur les contrôleurs et les actions. Cela a bien fonctionné mais une nouvelle ride est apparue.ASP.NET MVC: Autorisation dans une Action - Motifs suggérés ou est-ce une odeur?
Objet: Expédition
Rôles: Expédition, Comptabilité, utilisateur général
L'expédition se déplace à travers un flux de travail. Dans l'état A, il peut être édité par Shipping uniquement. Dans l'état B, il peut être édité par Accounting uniquement.
J'ai un ShipmentController, et une action d'édition. Je peux mettre un attribut Authorization pour limiter l'action Edit à ces deux rôles, mais cela ne fait pas la différence entre l'état dans lequel se trouve l'envoi. J'aurais besoin de faire une autorisation dans l'action avant l'appel de service pour déterminer si l'utilisateur est vraiment autorisé à exécuter l'action d'édition.
Je me reste deux questions:
1) Ce qui est une bonne façon d'avoir l'autorisation à l'intérieur d'une action. L'action Contrôleur appelle un service et le service effectue alors les appels appropriés à l'objet Envoi (quantité de mise à jour, date de mise à jour, etc.). Je suis sûr que je veux que l'objet d'expédition soit agnostique de toutes les exigences d'autorisation. D'un autre côté, je ne sais pas vraiment si je voudrais que l'objet de service connaisse l'autorisation ou non. Y a-t-il de bons modèles pour cela?
2) Mon problème est-il réellement un symptôme de mauvaise conception? Au lieu de ShipmentController devrais-je avoir un StateAShipmentController et StateBShipmentController? Je n'ai aucun polymorphisme intégré dans l'objet Shipment (l'état est juste une énumération), mais peut-être que je devrais et peut-être que les contrôleurs devraient refléter cela.
Je suppose que je suis après des solutions plus générales, pas une spécifique pour mon cas. Je voulais juste donner un exemple pour illustrer la question.
Merci!
Pourquoi ne pas créer votre propre filtre d'action [Authorize] pour les éléments liés à l'envoi? –
créer votre propre filtre [Authorize] serait vraiment une très mauvaise idée, et c'est une idée que l'équipe de développeurs ASP.NET MVC a vraiment vraiment déconseillée. –
@Josh; Je ne suis pas d'accord. Ce n'est pas une "vraiment, vraiment mauvaise idée", c'est juste une approche qui doit être abordée avec soin. Je n'ai vu aucun article public sur le décourager du tout, encore moins avec plusieurs «vraiment» et «fortement». Le seul vrai "gotcha" de ma connaissance est que vous voulez hériter de l'attribut Authorize fourni par le framework, parce que de cette façon vous pouvez vous assurer qu'il est déclenché de manière fiable au bon endroit. – Paul