2009-07-02 27 views
9

Qual è il modo migliore per gestire una password scaduta in una applicazione ASP.NET MVC ?ASP.NET MVC - Come gestire una password scaduta?

Mi spiego - ASP.NET MVC è ovviamente impostato (sia in app barebone l'esempio NerdDinner) per gestire i seguenti scenari:

  • registrare nuovi utenti
  • consentire loro di cambiare la propria password
  • Entra utilizzando un account/password valida

Quello che non ha è davvero un buon modo per effettuare le seguenti operazioni:

  • forzare l'utente a modificare la propria password se è scaduto

Il modo in cui ASP.NET MVC di punti di pensiero per l'idea di avere l'utente andare a un URL/vista separata per eseguire le modifiche delle password .

Il problema con questa idea è che non voglio che le persone a essere in grado di andare a questo URL se non sono connessi, e non voglio che siano in grado di andare da nessuna altra nel sito con una password scaduta.

In passato il modo in cui l'ho gestito è quello di impedire all'utente di uscire dalla pagina di accesso e di visualizzare un pannello ASP.NET con il bit "oh hey è necessario modificare la password" e nascondere il resto della pagina. A questo punto l'utente non ha ancora effettuato l'accesso, quindi non sarà autenticato e non potrà andare da nessuna parte finché non cambierà la sua password.

Ma ASP.NET MVC rende questo difficile. Se mi piace farlo sopra e avere tutto nella pagina di accesso, allora devo avere una azione di login() molto ingombrante per gestire tutti i possibili valori pubblicati. Se lo faccio pubblicare su un'altra azione/vista, corro il rischio di dover accedere l'utente o fare in modo che la pagina della password di modifica non sia protetta dall'autenticazione (poiché, a differenza del bit "change password" che viene fornito, I non voglio che siano autenticati quando vedono la pagina).

Posso immaginare alcuni scenari in cui si imposta qualcosa in ViewData per indicare che la password è scaduta e si ostina a reindirizzare l'utente alla pagina "Cambia password", ma non sono sicuro che sia una cosa sicura da fare .

risposta

6

Prendere in considerazione l'utilizzo di un AuthorizeFilter personalizzato (che estende l'esistente) che imposta ActionResult su AuthorizationContext per reindirizzare all'azione della password di modifica se l'utente è autenticato ma la password è scaduta. Ciò consentirebbe loro di accedere normalmente, ma li limiterà a solo quell'azione se la loro password è scaduta. Uso un approccio simile in una delle mie app che reindirizza una persona a una pagina di registrazione di un evento se sono registrate nel sito ma non si sono ancora registrate per un evento (è un'app di gestione eventi di beneficenza).

Si potrebbe persino essere in grado di implementarlo come filtro separato e utilizzare ancora quello esistente per l'autorizzazione.

[Authorize] 
[RequiresUnexpiredPassword] 
public class MyController : Controller 
{ 
    ... 
} 

Naturalmente, che avrebbe dovuto assicurarsi che l'azione ChangePassword è consentito di procedere senza essere reindirizzato dal filtro.

+1

Penso che non sia una buona idea creare attributo RequiresUnexpiredPassword perché sarà necessario applicare questo attributo a TUTTI i controller [Supponendo che l'autore non desideri che l'utente sfoglia l'applicazione con la password scaduta]. È meglio modificare il comportamento dell'attributo Autorizza stesso. – SolutionYogi

+1

Devi ricordarti di decorare anche i metodi/controller con l'attributo Authorize. Come ho detto, potresti estendere il filtro di autorizzazione O avere un attributo separato. Un attributo separato sarebbe in linea con il principio della responsabilità unica e sarebbe anche flessibile. In questo caso, tuttavia, probabilmente andrò con il mio primo suggerimento - che è anche il tuo suggerimento meno l'eccezione - e utilizzare un filtro di autorizzazione personalizzato. – tvanfosson

+0

Sì, ma l'attributo Authorize è già presente, quindi è un punto controverso. – SolutionYogi

4

Come creare un AuthorizationAttribute personalizzato e sovrascrivere il metodo OnAuthorization [Codice di esempio qui: asp.net mvc Adding to the AUTHORIZE attribute].

In questo metodo, è possibile verificare se la password è scaduta, lanciare PasswordExpiredException. Cattura questa eccezione in Base Controller e reindirizza l'utente sull'azione 'Cambia password'.

+5

Perché lanciare un'eccezione quando puoi basta impostare la proprietà del risultato AuthorizeContext e effettuare il reindirizzamento? – tvanfosson

Problemi correlati