changeset 94:db4b1e2cae49

Cambio del nombre de la clase Ponente a Persona Se agrega la clase Cuenta para identificar cada una de las cuentas con que se puede autenticar una persona Alta Automatica de cuentas de twitter creando la persona
author Nelo@Kenia.neluz.int
date Sat, 04 Jun 2011 12:11:17 -0300
parents 65f0b3d70c18
children 83d76f6e0a3c
files Agendas/trunk/src/Agendas.Blog/Impl/AgendarReunionPostWriter.cs Agendas/trunk/src/Agendas.Blog/Impl/PostWriter.cs Agendas/trunk/src/Agendas.Blog/Impl/PublicarReunionPostWriter.cs Agendas/trunk/src/Agendas.Domain/Agenda.cs Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj Agendas/trunk/src/Agendas.Domain/Cuenta.cs Agendas/trunk/src/Agendas.Domain/Evento.cs Agendas/trunk/src/Agendas.Domain/Identificable.cs Agendas/trunk/src/Agendas.Domain/IdentityContext.cs Agendas/trunk/src/Agendas.Domain/Persona.cs Agendas/trunk/src/Agendas.Domain/Ponente.cs Agendas/trunk/src/Agendas.Domain/Repositories/IEventoRepository.cs Agendas/trunk/src/Agendas.Domain/Repositories/IPersonaRepository.cs Agendas/trunk/src/Agendas.Domain/Services/PersonaService.cs Agendas/trunk/src/Agendas.Domain/Track.cs Agendas/trunk/src/Agendas.Factories/AgendaFactory.cs Agendas/trunk/src/Agendas.NHibernate/NhHelper.cs Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs Agendas/trunk/src/Agendas.Repositories.Memory/PersonaRepository.cs Agendas/trunk/src/Agendas.Repositories.Memory/PonenteRepository.cs Agendas/trunk/src/Agendas.Repositories.NHibernate/PonenteRepository.cs Agendas/trunk/src/Agendas.Tests/AgendarTests.cs Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj Agendas/trunk/src/Agendas.Tests/Cruds/EventoCrud.cs Agendas/trunk/src/Agendas.Tests/Cruds/EventoCrudNhTests.cs Agendas/trunk/src/Agendas.Tests/Cruds/EventoTests.cs Agendas/trunk/src/Agendas.Tests/PersonaServiceTests.cs Agendas/trunk/src/Agendas.Tests/PonentesTests.cs Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs Agendas/trunk/src/Agendas.Tests/TestBase.cs Agendas/trunk/src/Agendas.Tests/TrackTests.cs Agendas/trunk/src/Agendas.Tests/Workflows/Workflow.cs Agendas/trunk/src/Agendas.Tests/Workflows/WorkflowTests.cs Agendas/trunk/src/Agendas.Twitter/oAuthTwitter.cs Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj Agendas/trunk/src/Agendas.Web/Controllers/AccountController.cs Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs Agendas/trunk/src/Agendas.Web/Controllers/PropuestaController.cs Agendas/trunk/src/Agendas.Web/Global.asax.cs Agendas/trunk/src/Agendas.Web/IdentityHelper.cs Agendas/trunk/src/Agendas.Web/Views/Shared/_LogOnPartial.cshtml Agendas/trunk/src/Agendas.Web/Views/Web.config
diffstat 42 files changed, 490 insertions(+), 281 deletions(-) [+]
line wrap: on
line diff
--- a/Agendas/trunk/src/Agendas.Blog/Impl/AgendarReunionPostWriter.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Blog/Impl/AgendarReunionPostWriter.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -11,7 +11,7 @@
 		protected override string GetTitle(Evento evento)
 		{
 			return string.Format(CultureInfo.InvariantCulture, Resources.VAN_Realizacion_Title,
-													 evento.Ponente.Nombre, //Nombre y apellido del ponente
+													 evento.Persona.Nombre, //Nombre y apellido del ponente
 													 evento.Titulo //Tema a tratar en la reunion
 				);
 		}
@@ -21,7 +21,7 @@
 			var fecha = getFechaFormateada(evento.Fecha);
 			return string.Format(CultureInfo.InvariantCulture, Resources.VAN_Realizacion_Body,
 													 fecha, //Fecha y hora en GMT+0
-													 evento.Ponente.Nombre, //Nombre y apellido del ponente
+													 evento.Persona.Nombre, //Nombre y apellido del ponente
 													 evento.Titulo, //Tema a tratar en la reunion
 													 getUrlInvitacion(evento), //Url a la invitacion realizada por el ponente (por lo general es el thread en la lista de correo)
 													 GetNombreUsuario(evento) //Usuario que postea en el blog
--- a/Agendas/trunk/src/Agendas.Blog/Impl/PostWriter.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Blog/Impl/PostWriter.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -19,7 +19,7 @@
 
     protected string GetNombreUsuario(Evento evento)
     {
-      return evento.Tracks.Single(t => t.Accion == Accion.Publicar).Usuario;
+      return evento.Tracks.Single(t => t.Accion == Accion.Publicar).Usuario.Nombre;
     }
 
     protected void ExecuteService(string title, string body)
--- a/Agendas/trunk/src/Agendas.Blog/Impl/PublicarReunionPostWriter.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Blog/Impl/PublicarReunionPostWriter.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -11,7 +11,7 @@
     {
       return string.Format(CultureInfo.InvariantCulture, Resources.VAN_Publicacion_Title,
                            evento.NumeroOrden, //# de VAN en el historial
-                           evento.Ponente.Nombre //Nombre y apellido del ponente
+                           evento.Persona.Nombre //Nombre y apellido del ponente
 
         );
     }
--- a/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -8,14 +8,14 @@
 	public class Agenda
 	{
 		private readonly IEventoRepository _eventosRepository;
-		private readonly IPonenteRepository _ponenteRepository;
+		private readonly IPersonaRepository _personaRepository;
 		private readonly IPublicador _publicador;
 
 		public Agenda(IPublicador publicador, IEventoRepository eventosRepository,
-		              IPonenteRepository ponenteRepository)
+		              IPersonaRepository personaRepository)
 		{
 			_publicador = publicador;
-			_ponenteRepository = ponenteRepository;
+			_personaRepository = personaRepository;
 			_eventosRepository = eventosRepository;
 		}
 
@@ -41,17 +41,17 @@
 		{
 			Evento evento = GetEvento(eventoId);
 
-			Ponente ponente = null;
+			Persona persona = null;
 			if (!string.IsNullOrWhiteSpace(ponenteNombre))
-				ponente = GetPonente(ponenteNombre);
+				persona = GetPonente(ponenteNombre);
 
 			if (evento.Titulo != titulo)
 				evento.CambiarTitulo(titulo);
 
 			if (evento.Fecha == null && fecha != null)
-				evento.Agendar(ponente, fecha, urlInvitacion);
-			else if (evento.Fecha != fecha || evento.Ponente != ponente || evento.UrlInvitacion != urlInvitacion)
-				evento.Actualizar(ponente, fecha, urlInvitacion);
+				evento.Agendar(persona, fecha, urlInvitacion);
+			else if (evento.Fecha != fecha || evento.Persona != persona || evento.UrlInvitacion != urlInvitacion)
+				evento.Actualizar(persona, fecha, urlInvitacion);
 
 			Notify(evento);
 
@@ -65,8 +65,8 @@
 
 		public Resultado Proponer(string titulo, string ponenteNombre, string urlInvitacion)
 		{
-			Ponente ponente = GetPonente(ponenteNombre);
-			var evento = Evento.Proponer(titulo, ponente, urlInvitacion);
+			Persona persona = GetPonente(ponenteNombre);
+			var evento = Evento.Proponer(titulo, persona, urlInvitacion);
 
 			if (string.IsNullOrWhiteSpace(evento.Titulo))
 				return new Resultado(false);
@@ -74,7 +74,7 @@
 			Notify(evento);
 
 			_eventosRepository.Save(evento);
-			_ponenteRepository.Save(ponente);
+			_personaRepository.Save(persona);
 
 			return new Resultado(true);
 		}
@@ -86,18 +86,18 @@
 			if (string.IsNullOrWhiteSpace(ponenteNombre))
 				return new Resultado(false);
 
-			Ponente ponente = GetPonente(ponenteNombre);
+			Persona persona = GetPonente(ponenteNombre);
 
 			Evento evento = _eventosRepository.GetPropuestaByTitulo(titulo);
 			if (evento == null)
-				evento = Evento.Agendar(titulo, ponente, fecha.Value, urlInvitacion);
+				evento = Evento.Agendar(titulo, persona, fecha.Value, urlInvitacion);
 			else
-				evento.Agendar(ponente, fecha, urlInvitacion);
+				evento.Agendar(persona, fecha, urlInvitacion);
 
 			Notify(evento);
 
 			_eventosRepository.Save(evento);
-			_ponenteRepository.Save(ponente);
+			_personaRepository.Save(persona);
 
 			return new Resultado(true);
 		}
@@ -137,15 +137,15 @@
 
 		public void RegistrarPonente(string nombre, string mail, string twitter, string blog)
 		{
-			var ponente = new Ponente(nombre, mail, twitter, blog);
-			_ponenteRepository.Save(ponente);
+			var ponente = new Persona(nombre, mail, twitter, blog);
+			_personaRepository.Save(ponente);
 		}
 
-		private Ponente GetPonente(string nombre)
+		private Persona GetPonente(string nombre)
 		{
-			Ponente ponente = _ponenteRepository.GetByNombre(nombre) ?? new Ponente(nombre);
-			_ponenteRepository.Save(ponente);
-			return ponente;
+			Persona persona = _personaRepository.GetByNombre(nombre) ?? new Persona(nombre);
+			_personaRepository.Save(persona);
+			return persona;
 		}
 	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Agendas.Domain.csproj	Sat Jun 04 12:11:17 2011 -0300
@@ -42,6 +42,7 @@
   <ItemGroup>
     <Compile Include="Agenda.cs" />
     <Compile Include="CompositePublicador.cs" />
+    <Compile Include="Cuenta.cs" />
     <Compile Include="Evento.cs" />
     <Compile Include="Exceptions\EventoNotFoundException.cs" />
     <Compile Include="Exceptions\IdentityContextNotConfiguredException.cs" />
@@ -49,11 +50,13 @@
     <Compile Include="Identificable.cs" />
     <Compile Include="IdentityContext.cs" />
     <Compile Include="ISeguridad.cs" />
-    <Compile Include="Ponente.cs" />
+    <Compile Include="Persona.cs" />
     <Compile Include="Repositories\IEventoRepository.cs" />
     <Compile Include="IPublicador.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Repositories\IPersonaRepository.cs" />
     <Compile Include="Resultado.cs" />
+    <Compile Include="Services\PersonaService.cs" />
     <Compile Include="Track.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Domain/Cuenta.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -0,0 +1,19 @@
+namespace AltNetHispano.Agendas.Domain
+{
+	public class Cuenta : Identificable
+	{
+		public virtual Persona Persona { get; set; }
+		public virtual string LogonName { get; set; }
+		public virtual IdentityProviderEnum IdentityProvider { get; set; }
+
+		protected Cuenta()
+		{
+		}
+
+		public Cuenta(IdentityProviderEnum identityProvider, string logonName)
+		{
+			LogonName = logonName;
+			IdentityProvider = identityProvider;
+		}
+	}
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Domain/Evento.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Evento.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -13,7 +13,7 @@
 		#region Propiedades del Evento
 
 		private readonly IList<Track> _tracks;
-		private Ponente _ponente;
+		private Persona _persona;
 		private readonly ICollection<Track> _newTracks = new List<Track>();
 
 		/// <summary>
@@ -44,16 +44,16 @@
 		/// <summary>
 		/// Ponente o responsable del evento
 		/// </summary>
-		public virtual Ponente Ponente
+		public virtual Persona Persona
 		{
-			get { return _ponente; }
+			get { return _persona; }
 			private set
 			{
-				if (value == null && _ponente != null || value != _ponente && _ponente != null)
-					_ponente.RemoveEvento(this);
+				if (value == null && _persona != null || value != _persona && _persona != null)
+					_persona.RemoveEvento(this);
 				if (value != null)
 					value.AddEvento(this);
-				_ponente = value;
+				_persona = value;
 			}
 		}
 
@@ -73,11 +73,11 @@
 		/// Propone un evento
 		/// </summary>
 		/// <param name="titulo">Título del evento propuesto</param>
-		/// <param name="ponente">Ponente para evento propuesto</param>
+		/// <param name="persona">Ponente para evento propuesto</param>
 		/// <returns></returns>
-		public static Evento Proponer(string titulo, Ponente ponente, string urlInvitacion)
+		public static Evento Proponer(string titulo, Persona persona, string urlInvitacion)
 		{
-			var evento = new Evento {Titulo = titulo, Ponente = ponente, UrlInvitacion = urlInvitacion};
+			var evento = new Evento {Titulo = titulo, Persona = persona, UrlInvitacion = urlInvitacion};
 			evento.AddTrack(new Track(evento, Accion.Proponer));
 
 			return evento;
@@ -87,14 +87,14 @@
 		/// Agenda un evento que no estaba propuesto
 		/// </summary>
 		/// <param name="titulo">Título del evento a agendar</param>
-		/// <param name="ponente">Ponente para el evento</param>
+		/// <param name="persona">Ponente para el evento</param>
 		/// <param name="fecha">Fecha de realización del evento</param>
 		/// <param name="urlInvitacion">Url con la invitación realizada por el ponente</param>
 		/// <returns></returns>
-		public static Evento Agendar(string titulo, Ponente ponente, DateTime fecha, string urlInvitacion)
+		public static Evento Agendar(string titulo, Persona persona, DateTime fecha, string urlInvitacion)
 		{
 			var evento = new Evento { Titulo = titulo };
-			evento.Agendar(ponente, fecha, urlInvitacion);
+			evento.Agendar(persona, fecha, urlInvitacion);
 
 			return evento;
 		}
@@ -102,20 +102,20 @@
 		/// <summary>
 		/// Agenda el evento actual
 		/// </summary>
-		/// <param name="ponente">Ponente para el evento</param>
+		/// <param name="persona">Ponente para el evento</param>
 		/// <param name="fecha">Fecha de realización del evento</param>
 		/// <param name="urlInvitacion">Url con la invitación realizada por el ponente</param>
-		public virtual void Agendar(Ponente ponente, DateTime? fecha, string urlInvitacion)
+		public virtual void Agendar(Persona persona, DateTime? fecha, string urlInvitacion)
 		{
-			Ponente = ponente;
+			Persona = persona;
 			Fecha = fecha;
 			UrlInvitacion = urlInvitacion;
 			AddTrack(new Track(this, Accion.Agendar));
 		}
 
-		public virtual void Actualizar(Ponente ponente, DateTime? fecha, string urlInvitacion)
+		public virtual void Actualizar(Persona persona, DateTime? fecha, string urlInvitacion)
 		{
-			Ponente = ponente;
+			Persona = persona;
 			Fecha = fecha;
 			UrlInvitacion = urlInvitacion;
 
--- a/Agendas/trunk/src/Agendas.Domain/Identificable.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Identificable.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -2,7 +2,7 @@
 
 namespace AltNetHispano.Agendas.Domain
 {
-	public class Identificable
+	public abstract class Identificable
 	{
 		public virtual Guid Id { get; private set; }
 	}
--- a/Agendas/trunk/src/Agendas.Domain/IdentityContext.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/IdentityContext.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -1,20 +1,28 @@
-using AltNetHispano.Agendas.Domain.Exceptions;
+using System;
+using AltNetHispano.Agendas.Domain.Exceptions;
+using AltNetHispano.Agendas.Domain.Repositories;
 
 namespace AltNetHispano.Agendas.Domain
 {
 	public class IdentityContext
 	{
 		private static ISeguridad _current;
+		private static IPersonaRepository _personaRepository;
 
-		public static ISeguridad Current
+		public static void Init(ISeguridad seguridad, IPersonaRepository personaRepository)
 		{
-			private get
+			_current = seguridad;
+			_personaRepository = personaRepository;
+		}
+
+		private static ISeguridad Current
+		{
+			get
 			{
 				if (_current == null)
 					throw new IdentityContextNotConfiguredException();
 				return _current;
 			}
-			set { _current = value; }
 		}
 
 		public static string GetUserName()
@@ -24,5 +32,11 @@
 				throw new UsuarioNoAutenticadoException();
 			return username;
 		}
+
+		public static Persona GetUsuario()
+		{
+			var cuenta = _personaRepository.GetCuenta(IdentityProviderEnum.Twitter, GetUserName());
+			return cuenta != null ? cuenta.Persona : null;
+		}
 	}
 }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Domain/Persona.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -0,0 +1,80 @@
+using System.Collections.Generic;
+
+namespace AltNetHispano.Agendas.Domain
+{
+	public class Persona : Identificable
+	{
+		private readonly IList<Evento> _eventos;
+		private readonly IList<Cuenta> _cuentas;
+
+		protected Persona()
+		{
+			//ctor para NHibernate
+		}
+
+		public Persona(string nombre, string mail, string twitter, string blog)
+			: this(nombre)
+		{
+			Mail = mail;
+			Twitter = twitter;
+			Blog = blog;
+		}
+
+		public Persona(string nombre)
+		{
+			Nombre = nombre;
+			_eventos = new List<Evento>();
+			_cuentas=new List<Cuenta>();
+		}
+
+		public virtual string Nombre { get; private set; }
+
+		public virtual string Mail { get; private set; }
+
+		public virtual string Twitter { get; set; }
+
+		public virtual string Blog { get; private set; }
+
+		public virtual IEnumerable<Evento> Eventos
+		{
+			get { return _eventos; }
+		}
+
+		public virtual void AddEvento(Evento evento)
+		{
+			if (!_eventos.Contains(evento))
+				_eventos.Add(evento);
+		}
+
+		public virtual void RemoveEvento(Evento evento)
+		{
+			if (_eventos.Contains(evento))
+				_eventos.Remove(evento);
+		}
+
+		public virtual IEnumerable<Cuenta> Cuentas
+		{
+			get { return _cuentas; }
+		}
+
+		public virtual void AddCuenta(Cuenta cuenta)
+		{
+			if (!_cuentas.Contains(cuenta))
+				_cuentas.Add(cuenta);
+			cuenta.Persona = this;
+		}
+
+		public virtual void RemoveCuenta(Cuenta cuenta)
+		{
+			if (_cuentas.Contains(cuenta))
+				_cuentas.Remove(cuenta);
+			cuenta.Persona = null;
+		}
+	}
+
+	public enum IdentityProviderEnum
+	{
+		BuiltIn = 1,
+		Twitter = 2
+	}
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Domain/Ponente.cs	Sat Jun 04 00:07:20 2011 -0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-using System;
-using System.Collections.Generic;
-
-namespace AltNetHispano.Agendas.Domain
-{
-	public class Ponente : Identificable
-	{
-		private readonly IList<Evento> _eventos;
-
-		protected Ponente()
-		{
-			//ctor para NHibernate
-		}
-
-		public Ponente(string nombre, string mail, string twitter, string blog)
-			: this(nombre)
-		{
-			Mail = mail;
-			Twitter = twitter;
-			Blog = blog;
-		}
-
-		public Ponente(string nombre)
-		{
-			Nombre = nombre;
-			_eventos = new List<Evento>();
-		}
-
-		public virtual string Nombre { get; private set; }
-
-		public virtual string Mail { get; private set; }
-
-		public virtual string Twitter { get; private set; }
-
-		public virtual string Blog { get; private set; }
-
-		public virtual IEnumerable<Evento> Eventos
-		{
-			get { return _eventos; }
-		}
-
-		public virtual void AddEvento(Evento evento)
-		{
-			if (!_eventos.Contains(evento))
-				_eventos.Add(evento);
-		}
-
-		public virtual void RemoveEvento(Evento evento)
-		{
-			if (_eventos.Contains(evento))
-				_eventos.Remove(evento);
-		}
-	}
-}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Domain/Repositories/IEventoRepository.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Repositories/IEventoRepository.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -13,11 +13,4 @@
 		void Save(Evento evento);
 		void Update(Evento evento);
 	}
-
-	public interface IPonenteRepository
-	{
-		IList<Ponente> GetAll();
-		Ponente GetByNombre(string ponenteNombre);
-		void Save(Ponente ponente);
-	}
 }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Domain/Repositories/IPersonaRepository.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -0,0 +1,12 @@
+using System.Collections.Generic;
+
+namespace AltNetHispano.Agendas.Domain.Repositories
+{
+	public interface IPersonaRepository
+	{
+		IList<Persona> GetAll();
+		Persona GetByNombre(string ponenteNombre);
+		void Save(Persona persona);
+		Cuenta GetCuenta(IdentityProviderEnum identityProvider, string username);
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Domain/Services/PersonaService.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -0,0 +1,30 @@
+using AltNetHispano.Agendas.Domain.Repositories;
+
+namespace AltNetHispano.Agendas.Domain.Services
+{
+	public class PersonaService
+	{
+		private readonly IPersonaRepository _personaRepository;
+
+		public PersonaService(IPersonaRepository personaRepository)
+		{
+			_personaRepository = personaRepository;
+		}
+
+		public bool Validate(IdentityProviderEnum identityProvider, string username, string nombre)
+		{
+			var cuenta = _personaRepository.GetCuenta(identityProvider, username);
+			if (cuenta==null)
+			{
+				var persona=new Persona(nombre);
+				persona.AddCuenta(new Cuenta(identityProvider, username));
+
+				if (identityProvider == IdentityProviderEnum.Twitter)
+					persona.Twitter = username;
+
+				_personaRepository.Save(persona);
+			}
+			return true;
+		}
+	}
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Domain/Track.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Track.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -9,14 +9,14 @@
 
 		public Track(Evento evento, Accion accion)
 		{
-			Usuario = IdentityContext.GetUserName();
+			Usuario = IdentityContext.GetUsuario();
 			Evento = evento;
 			Accion = accion;
 		}
 
 		public virtual Evento Evento { get; private set; }
 		public virtual Accion Accion { get; private set; }
-		public virtual string Usuario { get; private set; }
+		public virtual Persona Usuario { get; private set; }
 	}
 
 	public enum Accion
--- a/Agendas/trunk/src/Agendas.Factories/AgendaFactory.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Factories/AgendaFactory.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -1,5 +1,8 @@
-using Agendas.NHibernate;
+using System;
+using Agendas.NHibernate;
 using AltNetHispano.Agendas.Domain;
+using AltNetHispano.Agendas.Domain.Repositories;
+using AltNetHispano.Agendas.Domain.Services;
 using AltNetHispano.Agendas.Repositories.NHibernate;
 using NHibernate;
 
@@ -13,7 +16,18 @@
 		public static Agenda GetAgenda()
 		{
 			ISessionFactory sessionFactory = NhHelper.GetSessionFactory();
-			return _agenda ?? (_agenda = new Agenda(null, new EventoRepository(sessionFactory), new PonenteRepository(sessionFactory)));
+			return _agenda ?? (_agenda = new Agenda(null, new EventoRepository(sessionFactory), new PersonaRepository(sessionFactory)));
+		}
+
+		public static IPersonaRepository GetPersonaRepository()
+		{
+			ISessionFactory sessionFactory = NhHelper.GetSessionFactory();
+			return new PersonaRepository(sessionFactory);
+		}
+
+		public static PersonaService GetPersonaService()
+		{
+			return new PersonaService(GetPersonaRepository());
 		}
 	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.NHibernate/NhHelper.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.NHibernate/NhHelper.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -18,12 +18,15 @@
 			if (_cfg == null)
 			{
 				var orm = new ObjectRelationalMapper();
+				orm.TablePerClass<Persona>();
 				orm.TablePerClass<Evento>();
 				orm.TablePerClass<Track>();
-				orm.TablePerClass<Ponente>();
+				orm.TablePerClass<Cuenta>();
 
-				orm.Cascade<Evento, Ponente>(Cascade.None);
-				orm.Cascade<Ponente, Evento>(Cascade.None);
+				orm.Cascade<Evento, Persona>(Cascade.None);
+				orm.Cascade<Persona, Evento>(Cascade.None);
+				
+				orm.Cascade<Persona, Cuenta>(Cascade.All);
 
 				var mapper = new Mapper(orm);
 
--- a/Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -15,8 +15,8 @@
 
 		public void Delete(Evento evento)
 		{
-			if (evento.Ponente != null)
-				evento.Ponente.RemoveEvento(evento);
+			if (evento.Persona != null)
+				evento.Persona.RemoveEvento(evento);
 			Objects.Remove(evento.Id);
 		}
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Repositories.Memory/PersonaRepository.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -0,0 +1,15 @@
+using System.Linq;
+using AltNetHispano.Agendas.Domain;
+using AltNetHispano.Agendas.Domain.Repositories;
+
+namespace AltNetHispano.Agendas.Repositories.Memory
+{
+	public class PersonaRepository : RepositoryBase<Persona>, IPersonaRepository
+	{
+		public Persona GetByLogonName(string logonName)
+		{
+			return Objects.Values.SingleOrDefault(p => p.Cuentas.Any(c=>c.LogonName==logonName));
+
+		}
+	}
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Repositories.Memory/PonenteRepository.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Repositories.Memory/PonenteRepository.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -1,18 +1,27 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
 using System.Linq;
 using AltNetHispano.Agendas.Domain;
 using AltNetHispano.Agendas.Domain.Repositories;
 
 namespace AltNetHispano.Agendas.Repositories.Memory
 {
-	public class PonenteRepository : RepositoryBase<Ponente>, IPonenteRepository
+	public class PersonaRepository : RepositoryBase<Persona>, IPersonaRepository
 	{
-		public Ponente GetByNombre(string nombre)
+		public Persona GetByNombre(string nombre)
 		{
 			return Objects.Values.SingleOrDefault(p => p.Nombre == nombre);
 		}
 
-		public IList<Ponente> GetAll()
+		public Cuenta GetCuenta(IdentityProviderEnum identityProvider, string username)
+		{
+			var cuentas = from p in Objects.Values
+			             select p.Cuentas.SingleOrDefault(c => c.IdentityProvider == identityProvider && c.LogonName == username);
+
+			return cuentas.Where(c => c != null).SingleOrDefault();
+		}
+
+		public IList<Persona> GetAll()
 		{
 			return Objects.Values.ToList();
 		}
--- a/Agendas/trunk/src/Agendas.Repositories.NHibernate/PonenteRepository.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Repositories.NHibernate/PonenteRepository.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -1,24 +1,32 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
 using AltNetHispano.Agendas.Domain;
 using AltNetHispano.Agendas.Domain.Repositories;
 using NHibernate;
 
 namespace AltNetHispano.Agendas.Repositories.NHibernate
 {
-	public class PonenteRepository : RepositoryBase<Ponente>, IPonenteRepository
+	public class PersonaRepository : RepositoryBase<Persona>, IPersonaRepository
 	{
-		public PonenteRepository(ISessionFactory sessionFactory) : base(sessionFactory)
+		public PersonaRepository(ISessionFactory sessionFactory) : base(sessionFactory)
 		{
 		}
 
-		public IList<Ponente> GetAll()
+		public IList<Persona> GetAll()
 		{
-			return Session.QueryOver<Ponente>().List();
+			return Session.QueryOver<Persona>().List();
 		}
 
-		public Ponente GetByNombre(string ponenteNombre)
+		public Persona GetByNombre(string ponenteNombre)
 		{
-			return Session.QueryOver<Ponente>().Where(p => p.Nombre == ponenteNombre).SingleOrDefault();
+			return Session.QueryOver<Persona>().Where(p => p.Nombre == ponenteNombre).SingleOrDefault();
+		}
+
+		public Cuenta GetCuenta(IdentityProviderEnum identityProvider, string username)
+		{
+			return
+				Session.QueryOver<Cuenta>().Where(c => c.IdentityProvider == identityProvider && c.LogonName == username).
+					SingleOrDefault();
 		}
 	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Tests/AgendarTests.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/AgendarTests.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -4,6 +4,7 @@
 using AltNetHispano.Agendas.Domain;
 using AltNetHispano.Agendas.Domain.Exceptions;
 using AltNetHispano.Agendas.Domain.Repositories;
+using AltNetHispano.Agendas.Repositories.Memory;
 using Moq;
 using NUnit.Framework;
 
@@ -28,7 +29,7 @@
 
 			publicador.Setup(p => p.Publicar(It.IsAny<IEnumerable<Track>>())).Throws(new Exception("Error intencional"));
 
-			var agenda = new Agenda(publicador.Object, repository.Object, DefaultPonenteRepository);
+			var agenda = new Agenda(publicador.Object, repository.Object, DefaultPersonaRepository);
 
 			Assert.Throws<Exception>(() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now, urlInvitacion));
 			Assert.AreEqual(0, agenda.GetEventosAgendados().Count);
@@ -40,12 +41,12 @@
 		[Test]
 		public void Intentar_agendar_evento_sin_servicio_de_seguridad()
 		{
-			IdentityContext.Current = null;
+			IdentityContext.Init(null, new PersonaRepository());
 
 			var publicador = new Mock<IPublicador>();
 			var repository = new Mock<IEventoRepository>();
 
-			var agenda = new Agenda(publicador.Object, repository.Object, DefaultPonenteRepository);
+			var agenda = new Agenda(publicador.Object, repository.Object, DefaultPersonaRepository);
 
 			Assert.Throws<IdentityContextNotConfiguredException>(
 				() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
@@ -56,12 +57,12 @@
 		[Test]
 		public void Intentar_agendar_evento_sin_usuario_autenticado()
 		{
-			SetCurrentUser(null);
+			SetCurrentUser(null, null);
 
 			var publicador = new Mock<IPublicador>();
 			var repository = new Mock<IEventoRepository>();
 
-			var agenda = new Agenda(publicador.Object, repository.Object, DefaultPonenteRepository);
+			var agenda = new Agenda(publicador.Object, repository.Object, DefaultPersonaRepository);
 
 			Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
 				urlInvitacion));
@@ -73,7 +74,7 @@
 		[Test]
 		public void Intentar_agendar_evento_sin_ponente()
 		{
-			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPonenteRepository);
+			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);
 
 			var r = agenda.Agendar("Van para publicar", string.Empty, DateTime.Now,
 				urlInvitacion);
@@ -90,7 +91,7 @@
 			var repository = new Mock<IEventoRepository>();
 
 			var agenda = new Agenda(new CompositePublicador(new[] {publicador1.Object, publicador2.Object}),
-															repository.Object, DefaultPonenteRepository);
+															repository.Object, DefaultPersonaRepository);
 
 			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
 				urlInvitacion);
@@ -105,7 +106,7 @@
 		{
 			var publicador = new Mock<IPublicador>();
 
-			var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPonenteRepository);
+			var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPersonaRepository);
 
 			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
 				urlInvitacion);
@@ -119,10 +120,10 @@
 
 			var evento = eventos[0];
 			
-			Assert.IsNotNull(evento.Ponente);
-			Assert.IsNotNull(evento.Ponente.Eventos);
-			Assert.AreEqual(1, evento.Ponente.Eventos.Count());
-			Assert.AreEqual(evento, evento.Ponente.Eventos.First());
+			Assert.IsNotNull(evento.Persona);
+			Assert.IsNotNull(evento.Persona.Eventos);
+			Assert.AreEqual(1, evento.Persona.Eventos.Count());
+			Assert.AreEqual(evento, evento.Persona.Eventos.First());
 
 		}
 
@@ -132,7 +133,7 @@
 			var repository = DefaultEventoRepository;
 			var publicador = new Mock<IPublicador>();
 
-			var agenda = new Agenda(publicador.Object, repository, DefaultPonenteRepository);
+			var agenda = new Agenda(publicador.Object, repository, DefaultPersonaRepository);
 
 			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
 				urlInvitacion);
@@ -150,7 +151,7 @@
 
 			evento = repository.GetEventosConFecha().First();
 			Assert.AreEqual("otro titulo", evento.Titulo);
-			Assert.AreEqual("otro ponente", evento.Ponente.Nombre);
+			Assert.AreEqual("otro ponente", evento.Persona.Nombre);
 			Assert.AreEqual(fecha, evento.Fecha);
 
 			var idEventoNoExistente = new Guid("99999999999999999999999999999999");
@@ -165,7 +166,7 @@
 			var publicador2 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(new CompositePublicador(new[] {publicador1.Object, publicador2.Object}),
-															DefaultEventoRepository, DefaultPonenteRepository);
+															DefaultEventoRepository, DefaultPersonaRepository);
 
 			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
 				urlInvitacion);
@@ -185,7 +186,7 @@
 			var publicador2 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }),
-															DefaultEventoRepository, DefaultPonenteRepository);
+															DefaultEventoRepository, DefaultPersonaRepository);
 
 			agenda.Proponer("Html 5", "jjmontes", urlInvitacion);
 			Assert.AreEqual(1, agenda.GetEventosPropuestos().Count);
--- a/Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj	Sat Jun 04 12:11:17 2011 -0300
@@ -73,6 +73,7 @@
     <Compile Include="Cruds\EventoCrud.cs" />
     <Compile Include="Cruds\EventoCrudNhTests.cs" />
     <Compile Include="DateTimeFormattingTests.cs" />
+    <Compile Include="PersonaServiceTests.cs" />
     <Compile Include="PonentesTests.cs" />
     <Compile Include="PropuestasTests.cs" />
     <Compile Include="Cruds\EventoTests.cs" />
--- a/Agendas/trunk/src/Agendas.Tests/Cruds/EventoCrud.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/Cruds/EventoCrud.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -10,12 +10,12 @@
 	{
 		private readonly IEventoRepository _eventoRepository;
 		private readonly Func<IDisposable> _requestEmulator;
-		private readonly IPonenteRepository _ponenteRepository;
+		private readonly IPersonaRepository _personaRepository;
 
-		public EventoCrud(Func<IEventoRepository> createEventoRepository, Func<IPonenteRepository> createPonenteRepository, Func<IDisposable> requestEmulator)
+		public EventoCrud(Func<IEventoRepository> createEventoRepository, Func<IPersonaRepository> createPonenteRepository, Func<IDisposable> requestEmulator)
 		{
 			_eventoRepository = createEventoRepository.Invoke();
-			_ponenteRepository = createPonenteRepository.Invoke();
+			_personaRepository = createPonenteRepository.Invoke();
 
 			_requestEmulator = requestEmulator;
 		}
@@ -24,8 +24,8 @@
 		{
 			using (_requestEmulator.Invoke())
 			{
-				var ponente = new Ponente("Carlos Blé");
-				_ponenteRepository.Save(ponente);
+				var ponente = new Persona("Carlos Blé");
+				_personaRepository.Save(ponente);
 
 				var evento = Evento.Proponer("TDD - Diseño Basado en Ejemplos", ponente, string.Empty);
 				_eventoRepository.Save(evento);
@@ -43,10 +43,10 @@
 				Evento van = _eventoRepository.Get(eventoId);
 
 				Assert.IsNotNull(van);
-				Assert.IsNotNull(van.Ponente);
-				Assert.AreEqual("Carlos Blé", van.Ponente.Nombre);
-				Assert.AreEqual(1, van.Ponente.Eventos.Count());
-				Assert.AreEqual(van, van.Ponente.Eventos.First());
+				Assert.IsNotNull(van.Persona);
+				Assert.AreEqual("Carlos Blé", van.Persona.Nombre);
+				Assert.AreEqual(1, van.Persona.Eventos.Count());
+				Assert.AreEqual(van, van.Persona.Eventos.First());
 
 				var track1 = van.Tracks.Where(t => t.Accion == Accion.Proponer).FirstOrDefault();
 				Assert.IsNotNull(track1);
@@ -68,8 +68,8 @@
 
 				van.CambiarTitulo("TDD & Ejemplos");
 
-				var otroPonente = new Ponente("José");
-				_ponenteRepository.Save(otroPonente);
+				var otroPonente = new Persona("José");
+				_personaRepository.Save(otroPonente);
 
 				van.Actualizar(otroPonente, new DateTime(2010, 04, 17), null);
 
@@ -81,16 +81,16 @@
 				Evento van = _eventoRepository.Get(eventoId);
 
 				Assert.IsNotNull(van);
-				Assert.IsNotNull(van.Ponente);
-				Assert.AreEqual("José", van.Ponente.Nombre);
+				Assert.IsNotNull(van.Persona);
+				Assert.AreEqual("José", van.Persona.Nombre);
 				Assert.AreEqual("TDD & Ejemplos", van.Titulo);
 				Assert.AreEqual(new DateTime(2010, 04, 17), van.Fecha);
 
-				var ponente1 = _ponenteRepository.GetByNombre("Carlos Blé");
+				var ponente1 = _personaRepository.GetByNombre("Carlos Blé");
 				Assert.IsNotNull(ponente1);
 				Assert.AreEqual(0, ponente1.Eventos.Count());
 
-				var ponente2 = _ponenteRepository.GetByNombre("José");
+				var ponente2 = _personaRepository.GetByNombre("José");
 				Assert.IsNotNull(ponente2);
 				Assert.AreEqual(1, ponente2.Eventos.Count());
 
@@ -117,7 +117,7 @@
 
 				Assert.IsNull(van);
 
-				var ponente = _ponenteRepository.GetByNombre("Carlos Blé");
+				var ponente = _personaRepository.GetByNombre("Carlos Blé");
 				
 				Assert.IsNotNull(ponente);
 				Assert.AreEqual(0, ponente.Eventos.Count());
--- a/Agendas/trunk/src/Agendas.Tests/Cruds/EventoCrudNhTests.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/Cruds/EventoCrudNhTests.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -31,14 +31,14 @@
 		{
 			var seguridad = new Mock<ISeguridad>();
 			seguridad.Setup(s => s.GetUserName()).Returns("neluz");
-			IdentityContext.Current = seguridad.Object;
+			IdentityContext.Init(seguridad.Object, new PersonaRepository(NhHelper.GetSessionFactory()));
 		}
 
 		[SetUp]
 		public void CreateCrud()
 		{
 			ISessionFactory sessionFactory=NhHelper.GetSessionFactory();
-			_eventoCrud = new EventoCrud(() => new EventoRepository(sessionFactory), () => new PonenteRepository(sessionFactory),
+			_eventoCrud = new EventoCrud(() => new EventoRepository(sessionFactory), () => new PersonaRepository(sessionFactory),
 			                             () => new RequestEmulator(sessionFactory));
 		}
 
--- a/Agendas/trunk/src/Agendas.Tests/Cruds/EventoTests.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/Cruds/EventoTests.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -17,7 +17,7 @@
 		public void BorrarRepositorios()
 		{
 			EventoRepository.Clear();
-			PonenteRepository.Clear();
+			PersonaRepository.Clear();
 		}
 
 		[SetUp]
@@ -25,13 +25,13 @@
 		{
 			var seguridad = new Mock<ISeguridad>();
 			seguridad.Setup(s => s.GetUserName()).Returns("neluz");
-			IdentityContext.Current = seguridad.Object;
+			IdentityContext.Init(seguridad.Object, new PersonaRepository());
 		}
 
 		[SetUp]
 		public void CreateCrud()
 		{
-			_eventoCrud = new EventoCrud(() => new EventoRepository(), ()=>new PonenteRepository(), () => new Mock<IDisposable>().Object);
+			_eventoCrud = new EventoCrud(() => new EventoRepository(), ()=>new PersonaRepository(), () => new Mock<IDisposable>().Object);
 		}
 
 		#endregion
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Tests/PersonaServiceTests.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -0,0 +1,39 @@
+using System.Linq;
+using AltNetHispano.Agendas.Domain;
+using AltNetHispano.Agendas.Domain.Repositories;
+using AltNetHispano.Agendas.Domain.Services;
+using Moq;
+using NUnit.Framework;
+
+namespace AltNetHispano.Agendas.Tests
+{
+	[TestFixture]
+	public class PersonaServiceTests : TestBase
+	{
+		[Test]
+		public void Crear_nueva_persona()
+		{
+			var personaRepository = new Mock<IPersonaRepository>();
+			Persona persona=null;
+			personaRepository.Setup(r => r.Save(It.IsAny<Persona>())).Callback<Persona>(p => persona = p);
+
+			var personaService = new PersonaService(personaRepository.Object);
+			
+			Assert.IsTrue(personaService.Validate(IdentityProviderEnum.Twitter, "nelopauselli", "Nelo Pauselli"));
+			personaRepository.Verify(r=>r.Save(It.IsAny<Persona>()), Times.Once());
+			Assert.IsNotNull(persona);
+			Assert.AreEqual(1, persona.Cuentas.Count());
+			Assert.AreEqual("nelopauselli", persona.Twitter);
+
+			Cuenta cuenta = persona.Cuentas.First();
+			Assert.AreEqual(IdentityProviderEnum.Twitter, cuenta.IdentityProvider);
+			Assert.AreEqual("nelopauselli", cuenta.LogonName);
+
+			personaRepository.Setup(r => r.GetCuenta(IdentityProviderEnum.Twitter, "nelopauselli")).Returns(cuenta);
+
+			Assert.AreEqual(1, persona.Cuentas.Count());
+			Assert.IsTrue(personaService.Validate(IdentityProviderEnum.Twitter, "nelopauselli", "Nelo Pauselli"));
+			Assert.AreEqual(1, persona.Cuentas.Count());
+		}
+	}
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Tests/PonentesTests.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/PonentesTests.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -16,8 +16,9 @@
 		public void Publicar_dos_eventos_con_el_mismo_ponente_no_registrado()
 		{
 			var publicador = new Mock<IPublicador>();
+			Assert.AreEqual(1, DefaultPersonaRepository.GetAll().Count);
 
-			var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPonenteRepository);
+			var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPersonaRepository);
 
 			agenda.Agendar("Audit (parallel model) con NHibernate 3", "Fabio Maulo", new DateTime(2011, 2, 26), 
 				urlInvitacion);
@@ -29,13 +30,13 @@
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(2));
 
-			Assert.AreEqual(1, DefaultPonenteRepository.GetAll().Count);
+			Assert.AreEqual(2, DefaultPersonaRepository.GetAll().Count);
 
 			var evento = eventos[0];
 
-			Assert.IsNotNull(evento.Ponente);
-			var ponente = evento.Ponente;
-			Assert.IsNotNull(evento.Ponente.Eventos);
+			Assert.IsNotNull(evento.Persona);
+			var ponente = evento.Persona;
+			Assert.IsNotNull(evento.Persona.Eventos);
 			Assert.Contains(eventos[0], new List<Evento>(ponente.Eventos));
 			Assert.Contains(eventos[1], new List<Evento>(ponente.Eventos));
 		}
@@ -48,7 +49,7 @@
 			publicador.Setup(p => p.Publicar(It.IsAny<IEnumerable<Track>>())).Callback<IEnumerable<Track>>(
 				t => evento = t.First().Evento);
 
-			var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPonenteRepository);
+			var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPersonaRepository);
 
 			agenda.RegistrarPonente("Fabio Maulo", "fabiomaulo@gmail.com", "@fabiomaulo", "http://fabiomaulo.blogspot.com");
 
@@ -59,10 +60,10 @@
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
 
 			Assert.IsNotNull(evento);
-			Assert.AreEqual("Fabio Maulo", evento.Ponente.Nombre);
-			Assert.AreEqual("fabiomaulo@gmail.com", evento.Ponente.Mail);
-			Assert.AreEqual("@fabiomaulo", evento.Ponente.Twitter);
-			Assert.AreEqual("http://fabiomaulo.blogspot.com", evento.Ponente.Blog);
+			Assert.AreEqual("Fabio Maulo", evento.Persona.Nombre);
+			Assert.AreEqual("fabiomaulo@gmail.com", evento.Persona.Mail);
+			Assert.AreEqual("@fabiomaulo", evento.Persona.Twitter);
+			Assert.AreEqual("http://fabiomaulo.blogspot.com", evento.Persona.Blog);
 		}
 
 		[Test]
@@ -73,7 +74,7 @@
 			publicador.Setup(p => p.Publicar(It.IsAny<IEnumerable<Track>>())).Callback<IEnumerable<Track>>(
 				t => evento = t.First().Evento);
 
-			var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPonenteRepository);
+			var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPersonaRepository);
 
 			agenda.Agendar("Audit (parallel model) con NHibernate 3", "Fabio Maulo", new DateTime(2011, 2, 26),
 				urlInvitacion);
@@ -83,29 +84,29 @@
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
 
 			Assert.IsNotNull(evento);
-			Assert.AreEqual("Fabio Maulo", evento.Ponente.Nombre);
-			Assert.IsNullOrEmpty(evento.Ponente.Twitter);
+			Assert.AreEqual("Fabio Maulo", evento.Persona.Nombre);
+			Assert.IsNullOrEmpty(evento.Persona.Twitter);
 		}
 
 		[Test]
 		public void Quitar_ponente_de_un_evento()
 		{
-			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPonenteRepository);
+			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);
 
 			const string titulo = "Audit (parallel model) con NHibernate 3";
 			Guid eventoId;
 
 			agenda.Proponer(titulo, "Fabio", urlInvitacion);
-			Ponente ponente;
+			Persona persona;
 			{
 				var eventos = agenda.GetEventosPropuestos();
 				Assert.AreEqual(1, eventos.Count);
 
 				Evento evento = eventos[0];
-				Assert.AreEqual("Fabio", evento.Ponente.Nombre);
+				Assert.AreEqual("Fabio", evento.Persona.Nombre);
 
 				eventoId = evento.Id;
-				ponente = evento.Ponente;
+				persona = evento.Persona;
 			}
 
 			agenda.ModificarPropuesta(eventoId, titulo, null, urlInvitacion);
@@ -114,42 +115,42 @@
 				Assert.AreEqual(1, eventos.Count);
 
 				Evento evento = eventos[0];
-				Assert.IsNull(evento.Ponente);
+				Assert.IsNull(evento.Persona);
 			}
 
-			Assert.AreEqual(0, ponente.Eventos.Count());
+			Assert.AreEqual(0, persona.Eventos.Count());
 		}
 
 		[Test]
 		public void Cambiar_ponente_de_un_evento()
 		{
-			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPonenteRepository);
+			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);
 
 			const string titulo = "Audit (parallel model) con NHibernate 3";
 			Guid eventoId;
 
 			agenda.Proponer(titulo, "Fabio", urlInvitacion);
-			Ponente ponente1;
+			Persona ponente1;
 			{
 				var eventos = agenda.GetEventosPropuestos();
 				Assert.AreEqual(1, eventos.Count);
 
 				Evento evento = eventos[0];
-				Assert.AreEqual("Fabio", evento.Ponente.Nombre);
+				Assert.AreEqual("Fabio", evento.Persona.Nombre);
 
 				eventoId = evento.Id;
-				ponente1 = evento.Ponente;
+				ponente1 = evento.Persona;
 			}
 
 			agenda.ModificarPropuesta(eventoId, titulo, "José", urlInvitacion);
-			Ponente ponente2;
+			Persona ponente2;
 			{
 				var eventos = agenda.GetEventosPropuestos();
 				Assert.AreEqual(1, eventos.Count);
 
 				Evento evento = eventos[0];
-				Assert.IsNotNull(evento.Ponente);
-				ponente2 = evento.Ponente;
+				Assert.IsNotNull(evento.Persona);
+				ponente2 = evento.Persona;
 			}
 
 			Assert.AreEqual(0, ponente1.Eventos.Count());
--- a/Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -17,7 +17,7 @@
 		[Test]
 		public void Crear_modificar_y_publicar_evento_propuesto()
 		{
-			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPonenteRepository);
+			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);
 
 			agenda.Proponer("Van", null, urlInvitacion);
 			{
@@ -35,7 +35,7 @@
 
 				evento = eventosPropuestos.FirstOrDefault();
 				Assert.AreEqual("Van 2", evento.Titulo);
-				Assert.AreEqual("otro ponente", evento.Ponente.Nombre);
+				Assert.AreEqual("otro ponente", evento.Persona.Nombre);
 			}
 
 			var r = agenda.Agendar("Van 2", "jjmontes", DateTime.Now, urlInvitacion);
@@ -52,7 +52,7 @@
 		[Test]
 		public void Intentar_agendar_evento_propuesto_sin_indicar_fecha()
 		{
-			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPonenteRepository);
+			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);
 
 			{
 				agenda.Proponer("Van propuesta", null, urlInvitacion);
@@ -70,7 +70,7 @@
 		[Test]
 		public void Intentar_agendar_evento_propuesto_sin_indicar_ponente()
 		{
-			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPonenteRepository);
+			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);
 
 			{
 				agenda.Proponer("Van propuesta", null, urlInvitacion);
@@ -92,7 +92,7 @@
 		{
 			var idEventoNoExistente = new Guid("99999999999999999999999999999999");
 
-			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPonenteRepository);
+			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);
 
 			Assert.Throws<EventoNotFoundException>(() => agenda.GetEvento(idEventoNoExistente));
 		}
@@ -102,7 +102,7 @@
 		{
 			var repository = new Mock<IEventoRepository>();
 
-			var agenda = new Agenda(null, repository.Object, DefaultPonenteRepository);
+			var agenda = new Agenda(null, repository.Object, DefaultPersonaRepository);
 
 			var r = agenda.Proponer(string.Empty, null, urlInvitacion);
 			Assert.IsFalse(r.Succeful);
@@ -113,9 +113,9 @@
 		[Test]
 		public void Intentar_proponer_evento_sin_usuario_autenticado()
 		{
-			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPonenteRepository);
+			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);
 
-			SetCurrentUser(null);
+			SetCurrentUser(null, null);
 
 			Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Proponer("Inmortalidad de la meduza.", null, urlInvitacion));
 		}
@@ -123,7 +123,7 @@
 		[Test]
 		public void Proponer_evento_correctamente()
 		{
-			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPonenteRepository);
+			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);
 			agenda.Proponer("Van propuesta", null, urlInvitacion);
 
 			IList<Evento> eventosPropuestos = agenda.GetEventosPropuestos();
@@ -135,7 +135,7 @@
 		[Test]
 		public void Verificar_propuesta_separada_de_publicacion()
 		{
-			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPonenteRepository);
+			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);
 
 			agenda.Proponer("Van propuesta", null, urlInvitacion);
 			var r = agenda.Agendar("Van publicada", "jjmontes", DateTime.Now,
--- a/Agendas/trunk/src/Agendas.Tests/TestBase.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/TestBase.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -1,5 +1,6 @@
 using AltNetHispano.Agendas.Domain;
 using AltNetHispano.Agendas.Domain.Repositories;
+using AltNetHispano.Agendas.Domain.Services;
 using AltNetHispano.Agendas.Repositories.Memory;
 using Moq;
 using NUnit.Framework;
@@ -13,9 +14,9 @@
 			get { return new EventoRepository(); }
 		}
 
-		protected static IPonenteRepository DefaultPonenteRepository
+		protected static IPersonaRepository DefaultPersonaRepository
 		{
-			get { return new PonenteRepository(); }
+			get { return new PersonaRepository(); }
 		}
 
 		[SetUp]
@@ -27,20 +28,23 @@
 		[SetUp]
 		public void LimpiarPonentes()
 		{
-			PonenteRepository.Clear();
+			PersonaRepository.Clear();
+			SetCurrentUser("nelopauselli", "Nelo Pauselli");
 		}
 
-		[SetUp]
-		public void SetearUsuario()
+		protected static void SetCurrentUser(string username, string nombre)
 		{
-			SetCurrentUser("neluz");
-		}
+			const IdentityProviderEnum identityProvider = IdentityProviderEnum.Twitter;
 
-		protected static void SetCurrentUser(string username)
-		{
 			var seguridad = new Mock<ISeguridad>();
 			seguridad.Setup(s => s.GetUserName()).Returns(username);
-			IdentityContext.Current = seguridad.Object;
+			
+			IPersonaRepository personaRepository = new PersonaRepository();
+			var service = new PersonaService(personaRepository);
+			service.Validate(identityProvider, username, nombre);
+
+			IdentityContext.Init(seguridad.Object, personaRepository);
+
 		}
 	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Tests/TrackTests.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/TrackTests.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -15,7 +15,7 @@
 		{
 			var repository = DefaultEventoRepository;
 
-			var agenda = new Agenda(null, repository, DefaultPonenteRepository);
+			var agenda = new Agenda(null, repository, DefaultPersonaRepository);
 
 			var fecha = DateTime.Now.AddDays(5);
 			agenda.Agendar("Html 5", "jjmontes", fecha, urlInvitacion);
@@ -25,18 +25,24 @@
 			var ultimo = evento.Tracks.Last();
 			Assert.AreEqual(evento, ultimo.Evento);
 			Assert.AreEqual(Accion.Agendar, ultimo.Accion);
+			Assert.IsNotNull(ultimo.Usuario);
+			Assert.AreEqual("Nelo Pauselli", ultimo.Usuario.Nombre);
 
 			agenda.ModificarEvento(evento.Id, "Html 5", "otro ponente", fecha, urlInvitacion);
 			Assert.AreEqual(2, evento.Tracks.Count());
 			ultimo = evento.Tracks.Last();
 			Assert.AreEqual(evento, ultimo.Evento);
 			Assert.AreEqual(Accion.Modificar, ultimo.Accion);
+			Assert.IsNotNull(ultimo.Usuario);
+			Assert.AreEqual("Nelo Pauselli", ultimo.Usuario.Nombre);
 
 			agenda.ModificarEvento(evento.Id, "Html 5 y Css 3", "otro ponente", fecha, urlInvitacion);
 			Assert.AreEqual(3, evento.Tracks.Count());
 			ultimo = evento.Tracks.Last();
 			Assert.AreEqual(evento, ultimo.Evento);
 			Assert.AreEqual(Accion.CambiarTitulo, ultimo.Accion);
+			Assert.IsNotNull(ultimo.Usuario);
+			Assert.AreEqual("Nelo Pauselli", ultimo.Usuario.Nombre);
 		}
 
 		[Test]
@@ -44,7 +50,7 @@
 		{
 			var repository = DefaultEventoRepository;
 
-			var agenda = new Agenda(null, repository, DefaultPonenteRepository);
+			var agenda = new Agenda(null, repository, DefaultPersonaRepository);
 
 			agenda.Agendar("Html 5", "jjmontes", DateTime.Now,
 				urlInvitacion);
--- a/Agendas/trunk/src/Agendas.Tests/Workflows/Workflow.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/Workflows/Workflow.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -9,9 +9,9 @@
 	{
 		private readonly Agenda _agenda;
 
-		public Workflow(IPublicador publicador, IEventoRepository eventoRepository, IPonenteRepository ponenteRepository)
+		public Workflow(IPublicador publicador, IEventoRepository eventoRepository, IPersonaRepository personaRepository)
 		{
-			_agenda = new Agenda(publicador, eventoRepository, ponenteRepository);
+			_agenda = new Agenda(publicador, eventoRepository, personaRepository);
 		}
 
 		public void Proponer()
--- a/Agendas/trunk/src/Agendas.Tests/Workflows/WorkflowTests.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/Workflows/WorkflowTests.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -16,7 +16,7 @@
 		public void InitPublicador()
 		{
 			_publicador = new Mock<IPublicador>();
-			_workflow = new Workflow(_publicador.Object, DefaultEventoRepository, DefaultPonenteRepository);
+			_workflow = new Workflow(_publicador.Object, DefaultEventoRepository, DefaultPersonaRepository);
 		}
 
 		[Test]
--- a/Agendas/trunk/src/Agendas.Twitter/oAuthTwitter.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Twitter/oAuthTwitter.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -7,7 +7,7 @@
 
 namespace AltNetHispano.Agendas.Twitter
 {
-    public class oAuthTwitter : OAuthBase
+    public class OAuthTwitter : OAuthBase
     {
         public enum Method { GET, POST, DELETE };
         public const string REQUEST_TOKEN = "http://twitter.com/oauth/request_token";
@@ -21,9 +21,7 @@
         private string _callBackUrl = "oob";
         private string _oauthVerifier = "";
 
-
-#region Properties
-        public string ConsumerKey 
+    	private string ConsumerKey 
         {
             get
             {
@@ -32,11 +30,10 @@
                     _consumerKey = ConfigurationManager.AppSettings["consumerKey"];
                 }
                 return _consumerKey; 
-            } 
-            set { _consumerKey = value; } 
+            }
         }
-        
-        public string ConsumerSecret { 
+
+    	private string ConsumerSecret { 
             get {
                 if (_consumerSecret.Length == 0)
                 {
@@ -44,7 +41,6 @@
                 }
                 return _consumerSecret; 
             } 
-            set { _consumerSecret = value; } 
         }
 
         public string Token { get { return _token; } set { _token = value; } }
@@ -52,8 +48,6 @@
         public string CallBackUrl { get { return _callBackUrl; } set { _callBackUrl = value; } }
         public string OAuthVerifier { get { return _oauthVerifier; } set { _oauthVerifier = value; } }
 
-#endregion
-
         /// <summary>
         /// Get the link to Twitter's authorization page for this application.
         /// </summary>
@@ -62,7 +56,7 @@
         {
             string ret = null;
 
-            string response = oAuthWebRequest(Method.GET, REQUEST_TOKEN, String.Empty);
+            string response = OAuthWebRequest(Method.GET, REQUEST_TOKEN, String.Empty);
             if (response.Length > 0)
             {
                 //response contains token and token secret.  We only need the token.
@@ -76,9 +70,9 @@
                     }
                 }
 
-                if (qs["oauth_token"] != null)
+                if (qs[OAuthTokenKey] != null)
                 {
-                    ret = AUTHORIZE + "?oauth_token=" + qs["oauth_token"];
+					ret = AUTHORIZE + "?" + OAuthTokenKey + "=" + qs[OAuthTokenKey];
                 }
             }
             return ret;
@@ -91,22 +85,22 @@
         /// <param name="oauthVerifier">An oauth_verifier parameter is provided to the client either in the pre-configured callback URL</param>
         public void AccessTokenGet(string authToken, string oauthVerifier)
         {
-            this.Token = authToken;
-            this.OAuthVerifier = oauthVerifier;
+            Token = authToken;
+            OAuthVerifier = oauthVerifier;
 
-            string response = oAuthWebRequest(Method.GET, ACCESS_TOKEN, String.Empty);
+            string response = OAuthWebRequest(Method.GET, ACCESS_TOKEN, String.Empty);
 
             if (response.Length > 0)
             {
                 //Store the Token and Token Secret
                 NameValueCollection qs = HttpUtility.ParseQueryString(response);
-                if (qs["oauth_token"] != null)
+                if (qs[OAuthTokenKey] != null)
                 {
-                    this.Token = qs["oauth_token"];
+					Token = qs[OAuthTokenKey];
                 }
-                if (qs["oauth_token_secret"] != null)
+				if (qs[OAuthTokenSecretKey] != null)
                 {
-                    this.TokenSecret = qs["oauth_token_secret"];
+					TokenSecret = qs[OAuthTokenSecretKey];
                 }
             }
         }
@@ -118,11 +112,11 @@
         /// <param name="url">The full url, including the querystring.</param>
         /// <param name="postData">Data to post (querystring format)</param>
         /// <returns>The web server response.</returns>
-        public string oAuthWebRequest(Method method, string url, string postData)
+        public string OAuthWebRequest(Method method, string url, string postData)
         {
-            string outUrl = "";
-            string querystring = "";
-            string ret = "";
+            string outUrl;
+            string querystring;
+            string ret;
 
 
             //Setup postData for signing.
@@ -141,7 +135,7 @@
                             postData += "&";
                         }
                         qs[key] = HttpUtility.UrlDecode(qs[key]);
-                        qs[key] = this.UrlEncode(qs[key]);
+                        qs[key] = UrlEncode(qs[key]);
                         postData += key + "=" + qs[key];
 
                     }
@@ -157,26 +151,26 @@
                 }
             }
 
-            Uri uri = new Uri(url);
+            var uri = new Uri(url);
             
-            string nonce = this.GenerateNonce();
-            string timeStamp = this.GenerateTimeStamp();
+            string nonce = GenerateNonce();
+            string timeStamp = GenerateTimeStamp();
 
             //Generate Signature
-            string sig = this.GenerateSignature(uri,
-                this.ConsumerKey,
-                this.ConsumerSecret,
-                this.Token,
-                this.TokenSecret,
-                this.CallBackUrl,
-                this.OAuthVerifier,
+            string sig = GenerateSignature(uri,
+                ConsumerKey,
+                ConsumerSecret,
+                Token,
+                TokenSecret,
+                CallBackUrl,
+                OAuthVerifier,
                 method.ToString(),
                 timeStamp,
                 nonce,
                 out outUrl,
                 out querystring);
 
-            querystring += "&oauth_signature=" + this.UrlEncode(sig);
+        	querystring += "&" + OAuthSignatureKey + "=" + UrlEncode(sig);
 
             //Convert the querystring to postData
             if (method == Method.POST || method == Method.DELETE)
@@ -204,9 +198,9 @@
         /// <returns>The web server response.</returns>
         public string WebRequest(Method method, string url, string postData)
         {
-            HttpWebRequest webRequest = null;
-            StreamWriter requestWriter = null;
-            string responseData = "";
+            HttpWebRequest webRequest;
+            StreamWriter requestWriter;
+            string responseData;
 
             webRequest = System.Net.WebRequest.Create(url) as HttpWebRequest;
             webRequest.Method = method.ToString();
@@ -224,22 +218,15 @@
                 {
                     requestWriter.Write(postData);
                 }
-                catch
-                {
-                    throw;
-                }
                 finally
                 {
                     requestWriter.Close();
-                    requestWriter = null;
                 }
             }
 
             responseData = WebResponseGet(webRequest);
 
-            webRequest = null;
-
-            return responseData;
+        	return responseData;
 
         }
 
@@ -251,22 +238,17 @@
         public string WebResponseGet(HttpWebRequest webRequest)
         {
             StreamReader responseReader = null;
-            string responseData = "";
+            string responseData;
 
             try
             {
                 responseReader = new StreamReader(webRequest.GetResponse().GetResponseStream());
                 responseData = responseReader.ReadToEnd();
             }
-            catch
-            {
-                throw;
-            }
             finally
             {
                 webRequest.GetResponse().GetResponseStream().Close();
                 responseReader.Close();
-                responseReader = null;
             }
 
             return responseData;
--- a/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj	Sat Jun 04 12:11:17 2011 -0300
@@ -72,6 +72,7 @@
     <Compile Include="CustomModelMetadataProvider\DataAnnotationAndConventionModelMetadataProvider.cs" />
     <Compile Include="CustomModelMetadataProvider\IResolverByConvention.cs" />
     <Compile Include="CustomModelMetadataProvider\ResolverThroughResource.cs" />
+    <Compile Include="IdentityHelper.cs" />
     <Compile Include="Models\AccountModels.cs" />
     <Compile Include="Models\EventoModel.cs" />
     <Compile Include="Models\PropuestaModel.cs" />
--- a/Agendas/trunk/src/Agendas.Web/Controllers/AccountController.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/AccountController.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -2,6 +2,8 @@
 using System.Web.Mvc;
 using System.Web.Routing;
 using System.Web.Security;
+using AltNetHispano.Agendas.Domain;
+using AltNetHispano.Agendas.Factories;
 using AltNetHispano.Agendas.Twitter;
 using AltNetHispano.Agendas.Web.Models;
 using AltNetHispano.Agendas.Web.Services;
@@ -60,7 +62,7 @@
 
 		public ActionResult TwitterLogOn()
 		{
-			var oAuth = new oAuthTwitter();
+			var oAuth = new OAuthTwitter();
 
 			if (Request["oauth_token"] == null)
 			{
@@ -81,13 +83,19 @@
 				{
 					//We now have the credentials, so make a call to the Twitter API.
 					const string url = "http://twitter.com/account/verify_credentials.xml";
-					string xml = oAuth.oAuthWebRequest(oAuthTwitter.Method.GET, url, String.Empty);
+					string xml = oAuth.OAuthWebRequest(OAuthTwitter.Method.GET, url, String.Empty);
 
 					var username = GetXmlContent(xml, "screen_name");
-					//TODO: Validar que este usuario de twitter corresponde a un usuario del sitio
+					var nombre = GetXmlContent(xml, "name");
 
-					FormsService.SignIn(username, false);
-					return RedirectToAction("Index", "Home");
+					var personaService = AgendaFactory.GetPersonaService();
+					if (personaService.Validate(IdentityProviderEnum.Twitter, username, nombre))
+					{
+						FormsService.SignIn(username, false);
+						return RedirectToAction("Index", "Home");
+					}
+					ModelState.AddModelError("", "The user name or password provided is incorrect.");
+
 
 					//POST Test
 					//url = "http://twitter.com/statuses/update.xml";
--- a/Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -54,7 +54,7 @@
 			            	{
 			            		Id = id,
 			            		Titulo = evento.Titulo,
-			            		Ponente = evento.Ponente != null ? evento.Ponente.Nombre : string.Empty,
+			            		Ponente = evento.Persona != null ? evento.Persona.Nombre : string.Empty,
 			            		Fecha = evento.Fecha,
                       UrlInvitacion = evento.UrlInvitacion
 			            	};
--- a/Agendas/trunk/src/Agendas.Web/Controllers/PropuestaController.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/PropuestaController.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -20,7 +20,7 @@
 			            		             		{
 			            		             			Id = e.Id.ToString(),
 			            		             			Titulo = e.Titulo,
-			            		             			Ponente = e.Ponente != null ? e.Ponente.Nombre : string.Empty
+			            		             			Ponente = e.Persona != null ? e.Persona.Nombre : string.Empty
 			            		             		}
 			            	};
 
@@ -59,7 +59,7 @@
 			            	{
 			            		Id = id,
 			            		Titulo = propuesta.Titulo,
-			            		Ponente = propuesta.Ponente != null ? propuesta.Ponente.Nombre : string.Empty,
+			            		Ponente = propuesta.Persona != null ? propuesta.Persona.Nombre : string.Empty,
 			            		UrlInvitacion = propuesta.UrlInvitacion
 			            	};
 			return View(model);
--- a/Agendas/trunk/src/Agendas.Web/Global.asax.cs	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Global.asax.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -41,7 +41,7 @@
             RegisterGlobalFilters(GlobalFilters.Filters);
             RegisterRoutes(RouteTable.Routes);
 
-            IdentityContext.Current = new HttpContextIdentityProvider();
+            IdentityContext.Init(new HttpContextIdentityProvider(), AgendaFactory.GetPersonaRepository());
         }
     }
 }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/IdentityHelper.cs	Sat Jun 04 12:11:17 2011 -0300
@@ -0,0 +1,19 @@
+using System.Web;
+using System.Web.Mvc;
+using AltNetHispano.Agendas.Domain;
+
+namespace AltNetHispano.Agendas.Web
+{
+	public static class IdentityHelper
+	{
+		public static string DisplayName(this HtmlHelper<dynamic> helper)
+		{
+			var personaRepository = Factories.AgendaFactory.GetPersonaRepository();
+			
+			string logonName = HttpContext.Current.User.Identity.Name;
+			
+			var c = personaRepository.GetCuenta(IdentityProviderEnum.Twitter, logonName);
+			return c == null ? logonName : c.Persona != null ? c.Persona.Nombre : c.LogonName;
+		}
+	}
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Views/Shared/_LogOnPartial.cshtml	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Views/Shared/_LogOnPartial.cshtml	Sat Jun 04 12:11:17 2011 -0300
@@ -1,5 +1,5 @@
 @if(Request.IsAuthenticated) {
-    <text>Welcome <b>@Context.User.Identity.Name</b>!
+    <text>Welcome <b>@Html.DisplayName()</b>!
     [ @Html.ActionLink("Log Off", "LogOff", "Account") ]</text>
 }
 else {
--- a/Agendas/trunk/src/Agendas.Web/Views/Web.config	Sat Jun 04 00:07:20 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Views/Web.config	Sat Jun 04 12:11:17 2011 -0300
@@ -16,6 +16,7 @@
 				<add namespace="System.Web.Mvc.Ajax" />
 				<add namespace="System.Web.Mvc.Html" />
 				<add namespace="System.Web.Routing" />
+				<add namespace="AltNetHispano.Agendas.Web"/>
 			</namespaces>
 		</pages>
 	</system.web.webPages.razor>