Applicazioni Web: consentire ai super utenti di impersonare altri utenti: esiste un modello di progettazione per questo?
Domanda
- Nella mia applicazione web, vorrei consentire ai super utenti di impersonare altri utenti.
La mia domanda:
Esiste un modello di progettazione generalmente accettato che potrei utilizzare per realizzare questo obiettivo?
- In generale, posso immaginare che dovrò tenere traccia dell'utente corrente e dell'utente impersonato all'interno della sessione.
-
Ma puoi capire che vorrei ridurre al minimo la complessità associata a questa modifica.
-
Per inciso, la mia applicazione è un'applicazione ASP.NET MVC 2, quindi se potessi sfruttare qualsiasi infrastruttura esistente, sarebbe fantastico.
MODIFICA: sto utilizzando l'autenticazione basata su moduli.
MODIFICA: dovrò anche monitorare il fatto che un super utente agisce per conto di un altro utente. Avrò bisogno di farlo per due motivi:
- La registrazione dovrebbe registrare il fatto che un super utente ha agito per conto di un altro utente.
- È concepibile che il superutente desideri tornare alla schermata di rappresentazione per "cambiare contesto" e impersonare un altro utente.
EDIT: @ Jordão ha proposto un soluzione per lo più praticabile . La mia unica preoccupazione è la seguente: se il super utente (mentre impersona un altro utente) passa alla schermata principale e la parte superiore dello schermo dice "Ciao [Utente]", voglio che dica "Ciao [Utente impersonato]" come opposto a "Hello [Super User]". E temo che la soluzione di @ Jordão renderebbe più complessa l'implementazione di questa schermata e di altre schermate con requisiti simili.
Soluzione
Non impersonare altri utenti, ma concedi ai super utenti autorizzazioni sufficienti e interfacce esclusive in modo che possano agire sui dati degli altri utenti.
Se poi disponi di dati di registrazione o di controllo, sai quale utente (normale o super) ha agito sui dati.
Altri suggerimenti
[Authorize(Roles = "Admin")]
public ActionResult Impersonate(string username)
{
FormsAuthentication.SignOut();
var cookie = FormsAuthentication.GetAuthCookie(username, false);
Response.AppendCookie(cookie);
return RedirectToAction("index");
}
.