chronos: Implementando una ventana de login


Chronos tenía hasta ahora una opción para cerrar la sesión de usuario activo, que no hace nada ahora mismo, y un label en el que se debería mostrar el usuario activo pero que al no haber funcionalidad para la identificación del usuario muestra siempre “Usuario anónimo”, así que me he puesto manos a la obra para implementar la identificación del usuario.

Para la implementación he utilizado un observador dedicado de nRoute, y lógicamente una ventana modal para pedir el nombre y la contraseña del usuario, además el ViewModel del Shell (ShellViewModel) tendrá su propio observador para poder actualizar el nombre del Usuario que se visualiza en pantalla.

image 

La ventana de login se abre una vez que la aplicación se ha iniciado, así

// Publish LogOn Request 
Channel<AuthenticationInfo>.Manager.PublishAsync(
    new AuthenticationInfo
    {
        Action = AuthenticationAction.LogOn
    });

 

En AuthenticationObserver se evaluará la acción a realizar en función de los datos que le lleguen

switch (value.Action)
{
    case AuthenticationAction.LogOn:
        ServiceLocator.GetService<INavigationService>().NavigateTo("Chronos/LogIn");
        break;

    case AuthenticationAction.LoggedIn:
        ServiceLocator.GetService<IElementManager>().Load("Desktop.xaml");
        break;

    case AuthenticationAction.LogOut:
        ThreadPool.QueueUserWorkItem(
            new WaitCallback(
                delegate
                {
                    ServiceLocator.GetService<IWindowManager>().CloseAllWindows();
                    ServiceLocator.GetService<IElementManager>().CloseAllElements();
                    Channel<AuthenticationInfo>.Manager.PublishAsync(
                        new AuthenticationInfo { Action = AuthenticationAction.LogOn });
                }));
        break;
}

Cuando la acción sea LogOn, se abrirá la ventana de identificación de usuario, cuando sea LoggedIn, se intentará realizar la carga del escritorio guardado en disco y cuando se LogOut cerrará todas las ventanas, los widgets, los accesos directos del escritorio y notificará de nuevo la acción de LogOn.

El observador de ShellViewModel está definido así

// create the observer
this.authenticationObserver = new ChannelObserver<AuthenticationInfo>(
    (l) => OnAuthenticationAction(l));

// subscribe on the UI Thread
this.authenticationObserver.Subscribe(ThreadOption.UIThread);

 

y se encargará simplemente de actualizar el nombre de usuario dependiendo de si la acción notificada es LogOn o LogOut

private void OnAuthenticationAction(AuthenticationInfo info)
{
    switch (info.Action)
    {
        case AuthenticationAction.LoggedIn:
            this.UserName = info.UserName;
            break;

        case AuthenticationAction.LogOut:
            this.UserName = null;
            break;

    }
}
 
image 
 

Ahora mismo no se realiza ninguna validación sobre los datos de identificación introducidos salvo que estos no estén vacios, en el momento en el que el usuario acepta los datos se notifica la acción de LoggedIn, con el nombre del usuario y se cierra la ventana

private void OnAccept()
{
    Channel<AuthenticationInfo>.Manager.PublishAsync(
        new AuthenticationInfo 
        { 
            Action = AuthenticationAction.LoggedIn, 
            UserName = this.UserName 
        });

    ServiceLocator.GetService<IWindowManager>().CloseDialog();
}  

Y por último el LogOut se notifica en la acción asociada a la opción de cerrar sesión del Shell

protected virtual void OnCloseSession()
{
    Channel<AuthenticationInfo>.Manager.PublishAsync(
        new AuthenticationInfo { Action = AuthenticationAction.LogOut });
}

 
image 

Ahí va un pantallazo de la nueva ventana de login

image

About these ads

  1. Que tal Carlos !

    Curioso encontrarte via Google, hace un tiempo tuve que hacer una aplicacion con el cliente de Firebird para .NET CF y recuerdo que eras el responsable del desarrollo del cliente.
    Ahora andaba buscando informacion sobre MDI y encontre tu blog y Chronos por supuesto, no lo he descargado aun, pero queria preguntarte, esta basado den PRISM? te pregunto porque necesito hacer un sistema modular y WPF es donde lo hare; dado que tendre que usar Firebird como base de datos tambien creo que me podrias ayudar con algo mas, en uno de tus posts mencionabas una aplicacion en la que utilizarias un ORM y estabas decidiendo entre LLBLGEN y NHibernate, no te gustaba de NHibernate su falta de herramientas visuales, ahora esta Visual NHibernate (www.slyce.com) y me gusta en particular el soporte para Firebird de NHibernate, aunque tambien veo que Jiri esta trabajando bastante con el soporte para Firebird en EF, basado en tu experiencia cual ORM podrias recomendarme? sobre todo pensando en que mi base de datos principal sera Firebird.

    Agradezco desde ahora cualquier comentario/sugerencia

    Un saludo,
    Mocte

    • Hola:

      > esta basado den PRISM?

      No

      > no te gustaba de NHibernate su falta de herramientas visuales,

      Eso era una apreciación personal, por que el hacer (y mantener) los mappings a mano me llevaría más tiempo del que tengo ;) de hecho en su momento la aplicación se quedo parada por falta de tiempo, y ahora en algún momento espero retomarlo usando chronos (y la versión de Entity Framework que viene con .NET 4 como ORM)

      > basado en tu experiencia cual ORM podrias recomendarme?

      Como ya digo, por falta de tiempo no he podido dedicarle mucho tiempo a ninguno, espero poder ponerme un poco en serio con EF en un par de meses.

      • Carlos,

        Gracias por contestar, al final no he tomado la decision acerca del ORM, pero seguire investigando para ver con cual me quedo, basicamente cualquier me sirve y tengo toda la libertad para decidir asi que les dedicare algo de estudio a cada uno, y definitivamente pondre a Chronos en la fila, tiene muy buena pinta.

        Un saludo y felicidades por el gran trabajo que haces con Chronos.

        -Mocte


Deja un comentario

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s