Ho un'applicazione ASP.NET MVC che utilizza gli attributi di autorizzazione su controller e azioni. Questo ha funzionato bene, ma una nuova ruga si è manifestata.ASP.NET MVC: autorizzazione all'interno di un'azione - Modelli suggeriti o si tratta di un odore?
Oggetto: Spedizione
Ruoli: Spedizione, contabilità, utenti generali
La spedizione si muove attraverso un flusso di lavoro. Nello stato A può essere modificato solo dalla spedizione. Nello stato B può essere modificato solo da Contabilità.
Possiedo un controller di spedizione e un'azione di modifica. Posso inserire un attributo Authorization per limitare l'azione Edit solo a questi due ruoli, ma questo non fa distinzione tra lo stato in cui si trova la spedizione. Avrei bisogno di fare un po 'di autorizzazione all'interno dell'azione prima della chiamata di servizio per determinare se l'utente è veramente autorizzato ad eseguire l'azione di modifica.
Così ho lasciato con due domande:
1) Che cosa è un buon modo per avere l'autorizzazione all'interno di un'azione. L'Azione controller chiama un servizio e il servizio effettua quindi le chiamate appropriate all'oggetto Spedizione (quantità di aggiornamento, data di aggiornamento, ecc.). So per certo che voglio che l'oggetto della spedizione sia indipendente dai requisiti di autorizzazione. D'altra parte, non ho una vera comprensione se volessi che l'oggetto di servizio fosse a conoscenza dell'autorizzazione o meno. Ci sono dei buoni schemi per questo?
2) Il mio problema è in realtà un sintomo di progettazione errata? Invece di ShipmentController dovrei avere StateAShipmentController e StateBShipmentController? Non ho alcun polimorfismo incorporato nell'oggetto di spedizione (lo stato è solo un enum), ma forse dovrei e forse i controllori dovrebbero riflettere questo.
Immagino di dover cercare soluzioni più generali, non specifiche per il mio caso. Volevo solo fornire un esempio per illustrare la domanda.
Grazie!
Perché non creare il proprio filtro di azione [Autorizza] per il materiale relativo alla spedizione? –
creare il tuo filtro [Autorizza] sarebbe davvero una pessima idea, ed è uno che il team di sviluppo di ASP.NET MVC ha davvero scoraggiato davvero molto bene –
@Josh; Non sono d'accordo. Non è una "idea davvero pessima", è solo una che dovrebbe essere affrontata con la dovuta attenzione. Non ho visto nessun articolo pubblico su scoraggiarlo affatto, tanto meno con diversi "davvero" e "fortemente". L'unico vero 'trucco' della mia conoscenza è che vuoi ereditare dall'attributo Authorize fornito dal framework, perché in questo modo puoi assicurarti che venga licenziato in modo affidabile nel posto giusto. – Paul