que he usado COI que el extracto esta distancia con cierto éxito. La primera vez que se ha definido una clase para representar el usuario actualmente conectado:
public class CurrentUser
{
public CurrentUser(IIdentity identity)
{
IsAuthenticated = identity.IsAuthenticated;
DisplayName = identity.Name;
var formsIdentity = identity as FormsIdentity;
if (formsIdentity != null)
{
UserID = int.Parse(formsIdentity.Ticket.UserData);
}
}
public string DisplayName { get; private set; }
public bool IsAuthenticated { get; private set; }
public int UserID { get; private set; }
}
Se necesita una IIdentity
en el constructor para establecer sus valores. Para las pruebas unitarias, puede agregar otro constructor que le permita eludir la dependencia IIdentity
.
Y entonces yo uso Ninject (elija su favorita contenedor IoC, no importa), y creó un enlace para IIdentity
como tal:
Bind<IIdentity>().ToMethod(c => HttpContext.Current.User.Identity);
Luego, en el interior de mi controlador Declaro la dependencia en el constructor:
CurrentUser _currentUser;
public HomeController(CurrentUser currentUser)
{
_currentUser = currentUser;
}
el contenedor IoC ve que HomeController
toma un objeto CurrentUser
, y la CurrentUser
constructor toma un IIdentity
. Resolverá las dependencias automáticamente, y ¡listo! Su controlador puede saber quién es el usuario que actualmente está conectado. Parece funcionar bastante bien para mí con FormsAuthentication. Es posible que pueda adaptar este ejemplo a la Autenticación de Windows.
Para mí, este método es preferible burlándose controladores y principios y contextos http, etc., como cada vez que olvido exactamente qué partes necesito para simular y tengo que buscar otras pruebas para encontrar el código adecuado para copiar y pegar. En mi caso, los controladores toman una interfaz ICurrentUserResolver, que tiene un método ResolveCurrentUser(), y el controlador nunca necesita preocuparse por cómo se determina el usuario actual. –
Gracias @JohnNelson, me salvaste la vida –