Ogni volta che un utente interagisce con una risorsa mentre non è loggato, ho bisogno di:
- Reindirizza a una pagina protetta.
- Mostra una finestra di accesso / accesso (che di solito è parzialmente personalizzata in base alla risorsa e potrebbe contenere un collegamento a una versione senza accesso della risorsa).
- Invia l'utente alla risorsa (se effettua il login).
Questo è un problema relativamente comune / semplice, ma sfortunatamente ci sono diverse grinze:
- Esistono diversi tipi di risorse, ognuna delle quali ha un controllo di accesso leggermente diverso.
- Alcune risorse richiedono una logica aziendale personalizzata e / o controlli di accesso.
- Alcuni stati utente richiedono una logica aziendale personalizzata e / o controlli di accesso.
Il mio approccio attuale, cresciuto organicamente nel tempo da più sviluppatori:
- Quando un utente richiede una risorsa, l'oggetto risorsa ne esegue uno o
più di quanto segue:
A) Riempire un oggetto stato nella sessione dell'utente.
B) Creare una stringa di query basata sulla corrente stato e sulla risorsa richiesta.
C) Indirizza l'utente a una pagina sicura.
- Altri controlli sulla pagina rilevano A-C. Uno di questi controlli esegue il rendering di una finestra di dialogo di accesso.
- La finestra di dialogo di accesso invia l'utente alla pagina risultante.
Funziona, ma ha diversi problemi:
- Il codice responsabile della gestione delle richieste di risorse è completamente indipendente dal codice che genera le richieste. In effetti, l'oggetto stato è una variabile globale specifica dell'utente.
- Il codice responsabile della gestione delle richieste di risorse per gli utenti registrati è strongmente separato dalle richieste di risorse di gestione codice per gli utenti non loggati, anche se è strongmente sovrapposto. Si noti che questo è un problema di indirezione (ad esempio, la duplicazione del codice viene per lo più evitata a favore di livelli di riferimento indiretto e chiamate strongmente nidificate al codice condiviso).
- Il codice è alquanto fragile; ci sono molti modi in cui può rompersi.
Come posso ripulirlo? Sto pensando di aggiungere un'azione (o una macchina a stati) all'oggetto di stato. Ciò darebbe all'oggetto di richiesta risorse il controllo diretto sull'oggetto risultato risorsa, piuttosto che il controllo indiretto tramite il controllo di accesso. Tuttavia, questo in realtà non mi sembra sufficiente per semplificare la logica.
Note:
- Sto usando i webform di asp.net con .Net 4.0.
- Non mi interessa se l'oggetto della sessione è serializzabile.