Abbiamo un'applicazione MVC con autorizzazione molto dettagliata e configurabile. Al momento abbiamo utilizzato l'attributo authorize per i nostri controller e le funzioni del controller.
Il prossimo progetto su cui lavoreremo richiederà che noi supportiamo un controllo a 3 stati. I 3 stati sono NoAccess, ReadAccess e FullAccess. NoAccess non richiede il rendering di alcun controllo, ReadAccess richiede il rendering di un'etichetta e FullAccess esegue il rendering di un controllo (casella di testo, menu a discesa, ecc.)
Il nostro primo approccio funzionante consisteva nell'aggiungere un dizionario al modello che contiene una chiave che identifica la proprietà e il valore di ciò che l'utente ha a disposizione della proprietà.
["FirstName", enumAccess.FullAccess]
Questo elemento verrà quindi passato in un'estensione html.
@html.TextboxFor(m => m.FirstName, Model.AccessDictionary["FirstName"])
L'estensione verrà quindi renderizzata in base al livello di accesso. NoAccess esegue il rendering di un oggetto nascosto, ReadAccess esegue il rendering di un'etichetta e un oggetto nascosto, FullAccess esegue il rendering di una casella di testo.
Il secondo approccio sarebbe quello di decorare la proprietà del modello con un attributo che dovrebbe specificare la chiave e nella casella di testo per l'estensione verificheremo gli attributi e verificheremo l'accesso con l'httpContext dell'utente che ha effettuato l'accesso. Questo secondo approccio non funzionerebbe per i nostri pulsanti di creazione o salvataggio poiché questi non sono legati al modello.
Ho cercato online alcuni esempi di configurazione complessa di viste e modelli, ma non ho ancora trovato nulla. Come accennato in precedenza, il primo approccio è al momento funzionante, ma non sembra molto elegante in quanto ogni sviluppatore richiede di compilare un dizionario su ogni modello e la vista ha molti punti di vista che potrebbero portare a aggiornamenti dannosi. Qualsiasi consiglio o direzione sarebbe molto apprezzato.