Aplicaciones web: Permitir que los superusuarios se hagan pasar por otros usuarios. ¿Existe un patrón de diseño para esto?
Pregunta
- En mi aplicación web, me gustaría permitir que los superusuarios se hagan pasar por otros usuarios.
Mi pregunta:
¿Existe un patrón de diseño generalmente aceptado que pueda utilizar para que esto suceda?
- En términos generales, puedo imaginar que tendré que realizar un seguimiento del usuario actual y del usuario suplantado dentro de la sesión.
-
Pero puede comprender que me gustaría minimizar la complejidad asociada a este cambio.
-
Por cierto, mi aplicación es una aplicación ASP.NET MVC 2, así que si pudiera aprovechar cualquier infraestructura existente, sería genial.
EDITAR: estoy usando autenticación de formularios.
EDITAR: también tendré que hacer un seguimiento del hecho de que un superusuario actúa en nombre de otro usuario. Necesitaré hacer esto por dos razones:
- El registro debe registrar el hecho de que un superusuario actuó en nombre de otro usuario.
- Es concebible que el superusuario quiera volver a la pantalla de suplantación de identidad para "cambiar de contexto" y hacerse pasar por otro usuario.
EDITAR: @ Jordão propuso un solución prácticamente viable . Mi única preocupación es la siguiente: si el superusuario (mientras se hace pasar por otro usuario) navega a la pantalla de inicio y la parte superior de la pantalla dice "Hola [Usuario]", quiero que diga "Hola [Usuario suplantado]" como opuesto a 'Hola [superusuario]'. Y me temo que la solución de @ Jordão haría más compleja la implementación de esta pantalla y otras pantallas con requisitos similares.
Solución
No hagas personales de otros usuarios, sino que le dan a los Super Usuarios suficientes autorizaciones y interfaces exclusivas para que puedan actuar sobre los datos de otros usuarios.
Si tiene datos de registro o auditoría, sabe que el usuario (normal o super) actuó sobre los datos.
Otros consejos
[Authorize(Roles = "Admin")]
public ActionResult Impersonate(string username)
{
FormsAuthentication.SignOut();
var cookie = FormsAuthentication.GetAuthCookie(username, false);
Response.AppendCookie(cookie);
return RedirectToAction("index");
}