Tengo una aplicación ASP.NET MVC utilizando Atributos de autorización en Controladores y Acciones. Esto ha estado funcionando bien pero ha aparecido una nueva arruga.ASP.NET MVC: Autorización dentro de una Acción - Patrones sugeridos o ¿esto es un olor?
objeto: Envío
Roles: envío, Contabilidad, usuario general
El envío se mueve a través de un flujo de trabajo. En el estado A, solo puede editarse mediante envío. En el estado B, solo se puede editar mediante Contabilidad.
Tengo un ShipmentController y una acción de edición. Puedo poner un atributo de Autorización para limitar la acción de Edición a solo esos dos roles, pero esto no distingue en qué estado está el Envío. Necesitaría hacer una Autorización dentro de la acción antes de la llamada de servicio para determinar si el usuario está realmente autorizado para ejecutar la acción de edición.
Así que estoy izquierda con dos preguntas:
1) ¿Cuál es una buena manera de tener la autorización dentro de una acción. La acción del controlador llama a un servicio, y el servicio realiza llamadas apropiadas al objeto de envío (cantidad de actualización, fecha de actualización, etc.). Sé con certeza que quiero que el objeto de envío sea independiente de los requisitos de autorización. Por otro lado, no entiendo muy bien si quisiera que el objeto de servicio tuviera conocimiento de la autorización o no. ¿Hay algún buen patrón para esto?
2) ¿Mi problema es realmente un síntoma de mal diseño? En lugar de ShipmentController, ¿debería tener un StateAShipmentController y StateBShipmentController? No tengo ningún polimorfismo incorporado en el objeto de envío (el estado es solo una enumeración), pero tal vez debería y tal vez los controladores deberían reflejar eso.
Supongo que estoy buscando soluciones más generales, no específicas para mi caso. Solo quería dar un ejemplo para ilustrar la pregunta.
Gracias!
¿Por qué no crear su propio filtro de acción tipo [Autorizar] para las cosas relacionadas con el envío? –
crear tu propio filtro [Autorizar] sería una muy mala idea, y es uno que el equipo de desarrollo ASP.NET MVC realmente ha desaconsejado realmente –
@Josh; Estoy en desacuerdo. No es una "idea realmente mala", es solo una que se debe abordar con la debida atención. No he visto ningún artículo público sobre desalentarlo en absoluto, y mucho menos con varios 'realmente' y 'muy'. La única 'sorpresa' de mi conocimiento es que desea heredar del atributo Autorizar proporcionado por el marco, porque de esa manera puede asegurarse de que se dispare de manera confiable en el lugar correcto. – Paul