[Windows 10] Biometría de huellas dactilares

Finger PrintIntroducción

En muchos desarrollos móviles tenemos la necesidad de contar con seguridad para limitar su acceso. Cuando hablamos de seguridad lo primero que se nos viene a la mente es la autenticación. La autenticación habitual, es decir, con usuario y contraseña, requieren una serie de características como gestión de las credenciales, complejidad de la contraseña, recuperación, etc.

Con Windows 10 tenemos dos nuevas tecnologías destinidas a facilitar la gestión de la seguridad tanto para usuarios como para desarrolladores integrando la tecnologías en sus Apps. Estas tecnologías son:

  • Windows Hello
  • Microsoft Passport

Windows Hello

El primero de ellos es un framework biométrico que soporta:

  • Reconocimiento facial
  • Escaneo de Iris
  • Huella

NOTA: Windows Hello requiere de hardware específico como lector de huellas o sensor

Microsoft Passport

Microsoft Passport aporta un mecanismo de autenticación que reemplaza las clásicas contraseñas por una combinación del dispositivo  junto a un PIN definido por el usuario o bien datos biométricos aportados por Windows Hello.

Datos biométricos, uso de huellas dactilares

Nuestro objetivo en este artículo será revisar todas las posibilidades brindadas por UserConsentVerifier. Esta nueva clase introducida en Windows 10 nos permite comprobar la disponibilidad de dispositivo que permita realizar una verificación biométrica (huella dactilar).

En nuestro ejemplo, contaremos con una interfaz sencilla:

<StackPanel
     HorizontalAlignment="Center"
     VerticalAlignment="Center">
     <Button 
          Content="Check UserConsent Availability" 
          Command="{Binding AvailabilityCommand}" />
     <TextBlock 
          Text="Request UserConsent Verification"
          Margin="0,24,0,0"/>
     <TextBox 
          PlaceholderText="Insert Message..."
          Text="{Binding Message, Mode=TwoWay}"/>
     <Button 
          Content="Request UserConsent Verification" 
          Command="{Binding VerificationCommand}"
          IsEnabled="{Binding IsUserConsentAvalaible}"/>
</StackPanel>

Un primer botón que nos indique la disponibilidad de dispositivo que permita realizar una verificación biométrica mientras que el segundo nos permitirá realizar la verificación del usuario con los datos biométricos.

Ambos botones contarán con un comando asociado en la ViewModel. El primero:

private ICommand _availabilityCommand;       

public ICommand AvailabilityCommand
{
     get { return _availabilityCommand = _availabilityCommand ?? new DelegateCommandAsync(AvailabilityCommandExecute); }
}

public async Task AvailabilityCommandExecute()
{

}

Y el segundo:

private ICommand _verificationCommand;

public ICommand VerificationCommand
{
     get { return _verificationCommand = _verificationCommand ?? new DelegateCommandAsync(VerificationCommandExecute); }
}

public async Task VerificationCommandExecute()
{

}

Nada especial a destacar llegados aquí. Continuamos…

Detectar si contamos con lector de huellas

Para poder utilizar datos biométricos en nuestra aplicación debemos antes que nada verificar si el dispositivo cuenta con lector de huellas. Podemos utilizar el método UserConsentVerifier.CheckAvailabilityAsync para la verificación.

En el servicio:

public async Task<UserConsentVerifierAvailability> GetUserConsentAvailabilityAsync()
{
     UserConsentVerifierAvailability consentAvailability =
     await UserConsentVerifier.CheckAvailabilityAsync();
     
     return consentAvailability;
}

El resultado será un valor de la enumeración UserConsentVerifierAvailability. Los posibles valores de la enumeración son:

  • Available: Dispositivo de verificación biométrica disponible.
  • DeviceBusy: El dispositivo de verificación biométrica está realizando una operación y no está disponible.
  • DeviceNorPresent: No hay dispositivo de verificación biométrica.
  • DisabledByPolicy: Por directiva de grupo, la verificación biométrica esta deshabilitada.
  • NotConfiguredForUser: No hay dispositivo de verificación biométrica configurado por el usuario actual.

Desde la viewmodel de la aplicación utilizaremos el servicio para la verificación:

IsUserConsentAvalaible = await _userConsentVerifierService.CheckUserConsentAvailabilityAsync();

Hasta este punto tenemos lo necesario para detectar si contámos con la posibilidad de usar datos biométricos o no.

Solicitud de consentimiento

Llega el momento de usar datos biométricos. Tras verificar la disponibilidad del lector debemos pedir consentimiento utilizando el método UserConsentVerifier.RequestVerificationAsync.

En nuestro servicio:

public async Task<UserConsentVerificationResult> GetRequestUserConsentVerificationAsync(string message)
{
     UserConsentVerificationResult consentResult =
     await UserConsentVerifier.RequestVerificationAsync(message);

     return consentResult;
}

NOTA: Para que la autenticación con la huella funcione correctamente, el usuario debe habe registrado su huella previamente.

Desde la viewmodel, bastará con usar el método anterior:

var result = await _userConsentVerifierService.GetRequestUserConsentVerificationAsync(Message);

Como parámetro pasamos una cadena. Esta cadena se utilizará para mostrar un mensaje al usuario en la solicitud de comprobación biométrica. En cuanto al resultado, obtenemos un valor de la enumeración UserConsentVerificationResult:

switch(result)
{
     case Windows.Security.Credentials.UI.UserConsentVerificationResult.Canceled:
          message = "Consent request prompt was canceled.";
          break;
     case Windows.Security.Credentials.UI.UserConsentVerificationResult.DeviceBusy:
          message = "Biometric device is busy.";
          break;
     case Windows.Security.Credentials.UI.UserConsentVerificationResult.DeviceNotPresent:
          message = "Biometric device not found.";
          break;
     case Windows.Security.Credentials.UI.UserConsentVerificationResult.DisabledByPolicy:
          message = "Disabled by policy.";
          break;
     case Windows.Security.Credentials.UI.UserConsentVerificationResult.NotConfiguredForUser:
          message = "No fingeprints registered.";
          break;
     case Windows.Security.Credentials.UI.UserConsentVerificationResult.RetriesExhausted:
          message = "Too many retries.";
          break;
     case Windows.Security.Credentials.UI.UserConsentVerificationResult.Verified:
          message = "User verified.";
          break;
}

Los valores de la enumeración son:

  • Verified: Huella comprobada correctamente.
  • DeviceNotPresent: Dispositivo biométrico no disponible.
  • NotConfiguredForUser: No hay ningún dispositivo biométrico configurado por el usuario actualo.
  • DisableByPolicy: La directiva de grupo ha deshabilitado el dispositivo biométrico.
  • DeviceBusy: Dispositivo biométrico ocupado al encontrarse realizando una operación.
  • RetriesExhausted: Tras 10 intentos, la solicitud de comprobación original y todos los intentos han fallado.
  • Canceled: Cancelación de la operación.

Sencillo, ¿cierto?.

Si ejecutamos la aplicación en un Lumia con opción biométrica, como por ejemplo un Lumia 950XL, ofrecerá dos opciones de auenticación:

  • Escáner de Iris
  • Código PIN

Igual resultado obtendremos en un PC que cuente con RealSense. Sin embargo, si probamos en un dispositivo sin posibilidad de detección biométrica aun así nos permitirá la validación vía código PIN.

PIN Code
PIN Code

De forma evidente no es un mecanismo de autenticación biométrica pero si suficiente para cubrir las necesidades de la API.

Tenéis el código fuente disponible en GitHub:

Ver GitHub

Recordad que podéis dejar cualquier comentario, sugerencia o duda en los comentarios.

Más información

[Xamarin.Forms] Utilizando Messaging Center

Mail Next-WFIntroducción

En el desarrollo de aplicaciones móviles multiplataforma con Xamarin es habitual utilizar el patrón MVVM para separar la vista de la lógica de negocio de la aplicación. De esta forma, podemos conseguir objetivos claves fundamentales como:

  • Nos permite dividir el trabajo de manera muy sencilla (diseñadores – desarrolladores)
  • El mantenimiento es más sencillo.
  • Permite realizar Test a nuestro código.
  • Permite una más fácil reutilización de código.
  • Compartir más código.

Xamarin.Forms incluye un completo sistema de enlace a datos y servicio de dependencias que nos permite realizar una completa implementación del patrón con facilidad. Sin embargo, en ocasiones, necesitamos ciertas «piezas» que nos permitan solucionar problemas existentes manteniendo la arquitectura intacta. En ocasiones realizamos cambios en un elemento de una vista que afecta a otro elemento correspondiente de otra. En este caso, debemos notificar de una viewmodel a otra del cambio.

¿Cómo lo hacemos?

Mensajes

Si has desarrollado previamente utilizando el patrón MVVM utilizando (o no) un framework posiblemente hayas utilizado lo que se conoce como sistema de mensajes. Basicamente la mensajería de basa en el patrón de diseño publish/subscribe. Contamos con tres grandes protagonistas:

  • Mensajes: Información a enviar normalmente relacionada con la lógica de negocio.
  • Publicadores: Cuando un evento ocurre, ya sea un simple click de un botón o una lógica compleja, los publicadores toman la información a enviar y publican el mensaje.
  • Subscriptores: En el lado opuesto, tenemos a los subscriptores que esperan la publicación de un mensaje de un tipo específico para captarlo con toda la información enviada y actuar en consecuencia.

Messaging Center

Xamarin.Forms cuenta con MessagingCenter para permitir la comunicación entre viewmodels u otros componentes sin que tengan que tener referencias entre ambos utilizando el patrón publish/subscribe.

Para probar MessagingCenter vamos a crear una aplicación Xamarin.Forms sencilla donde tendremos dos vistas. La primera vista mostrará un mensaje y un botón además de suscribirse a un mensaje de cambio. El mensaje se modificará utilizando MessagingCenter mientras que el botón permitirá navegar a la segunda vista. Al navegar a la segunda vista se publicará el mensaje de modo que, al regresar a la primera vista el mensaje será modificado.

Definimos la interfaz de la primera vista:

<StackLayout Padding="10" Spacing="10">
     <Label Text="{Binding Info}" />
     <Button 
          Text="Navigate to Second View"
          Command="{Binding NavigateCommand}"/>
</StackLayout>

El resultado:

Nuestra interfaz
Nuestra interfaz

En la viewmodel correspondiente a la vista definimos la propiedad que utilizaremos para mostrar el mensaje:

public string Info
{
     get { return _info; }
     set
     {
          _info = value;
          RaisePropertyChanged();
     }
}

Y el comando que permitirá la navegación a la segunda vista:

private ICommand _navigateCommand;

public ICommand NavigateCommand
{
     get { return _navigateCommand = _navigateCommand ?? new DelegateCommand(NavigateCommandExecute); }
}

public void NavigateCommandExecute()
{
     _navigationService.NavigateTo<SecondViewModel>();
}

En la primera vista vamos a suscribirnos a un mensaje. En Xamarin.Forms contamos con MessagingCenter que cuenta con dos partes fundamentales:

  • Suscripción (Subscribe): Se suscribe a un mensaje concreto para lanzar una acción.
  • Envío (Send): Publica un mensaje para ser captado por suscriptores. Si no existiese ningún subscriptor, el mensaje es ignorado.

La clase MessagingCenter es una clase estática que cuenta con varias sobrecargas del los métodos Subscribe y Send.

Podemos subscribirnos a un mensaje simple con una cadena:

Xamarin.Forms.MessagingCenter.Subscribe<FirstViewModel>(this, "Change", (sender) =>
{
     Info = "Changed from Messaging Center";
});

La viewmodel de la primera vista se subscribe a un mensaje de tipo string con el mensaje «Change».

Navegamos a la segunda vista:

Segunda vista
Segunda vista

En la viewmodel de la segunda vista procedemos a enviar un mensaje de tipo cadena con el valor «Change»:

Xamarin.Forms.MessagingCenter.Send(App.Locator.FirstViewModel, "Change");

Al regresar a la vista anterior, el mensaje ha cambiado con la lógica ejecutada en la subscripción del mensaje:

Mensaje recibido
Mensaje recibido

Sencillo, ¿cierto?

Pasar parámetros como argumento

Podemos pasar un argumento como parámetro del método Send:

MessagingCenter.Send(App.Locator.FirstViewModel, "Change", "Argument");

En la subscripción podemos capturar el parámetro de forma sencilla:

MessagingCenter.Subscribe<FirstViewModel>(this, "Change", (sender, arg) => {
    // Acceso a 'arg' para obtener el parametero
});

Podéis encontrar en GitHub el ejemplo de este artículo:

Ver GitHub

Recordad que cualquier duda o sugerencia la podéis dejar en los comentarios del blog.

Más información

[Evento SVQXDG] Sevilla Xamarin Dev Day

Xamarin LogoEl evento

En Sevilla, existen empresas y desarrolladores con un enorme talento utilizando Xamarin para sus desarrollos de Apps móviles. Con este crisol nació SVQXDG, o lo que es lo mismo, grupo de desarrolladores Xamarin de Sevilla. Es un grupo de usuario donde se busca tener un punto habitual de reunión para ayudar, compartir y aprender entre todos.

Continuamos con fuerza en el grupo organizando un nuevo evento completo con múltiples sesiones buscando cubrir múltiples aspectos relacionados con el desarrollo de aplicaciones Xamarin.

Tendremos la siguiente agenda:

  • 18:00h – 18:45h: Adaptar Apps Xamarin.Forms a teléfonos y tabletas. En esta sesión de la mano de Javier Suárez veremos como adaptar nuestras aplicaciones para otorgar la mejor experiencia posible en teléfonos y tabletas. Como adaptar vistas, tener vistas específicas, adaptar navegación o detectar DPIs y tamaño de pantalla serán algunos de los puntos que veremos.
  • 18:50h – 19:35h: Gestión de notificaciones Push en Apps Xamarin con Azure. Josué Yeray nos enseñará en esta sesión como usar notifications hubs de Azure para enviar notificaciones facilmente a cualquier plataforma. Veremos como funcionan las notificaciones push en cada plataforma así como implementarlas de forma sencilla.
  • 18:40h – 20:25h: Trucos y claves de App Xamarin hasta su llegada en la Store. Terminaremos el evento con una completa sesión de Marcos Cobeña en la que nos mostrará los detalles y claves a tener en cuenta en el desarrollo de una App Xamarin real ¡Buenos días! aro, desde su desarrollo hasta tenerla en la Store.

El lugar

El evento se celebrará en la ETS de Ingeniería Informática. Dirección detallada:

E.T.S. Ingeniería Informática – Universidad de Sevilla
Av. Reina Mercedes s/n
Sevilla Se 41012

ETS Ingeniería Informática
ETS Ingeniería Informática

La fecha

El evento tendrá lugar el próximo Miércoles, 06 de Abril de 18:00h a 20:30h. Tendremos tres sesiones de 45 minutos de duración cada una.

¿Te apuntas?

Más información

[Material] Seville Microsoft Communities Day

microsoft_.net_logoEl evento

El pasado 09 de Marzo, aprovechando la visita de miembros del equipo de DX de Microsoft para el University Tour 2016, como Alejandro Campos, las comunidades .NET de Sevilla decidimos organizar un divertido evento el día anterior, el Seville Microsoft Communities Day. Un evento donde tener hueco a sesiones técnicas sobre C# y Xamarin además de tener momentos para el networking y dar a conocer todas las comunidades.

Tenéis disponible una pequeña galería del evento a continuación:

El material

En mi caso pude participar en el evento junto a Marcos Cobeña con una introducción completa a Xamarin, desarrollo, herramientas y servicios. Vimos:

  • Desarrollo con Xamarin Classic.
  • Desarrollo con Xamarin Forms.
  • Un vistazo tanto a la integración con Visual Studio como a Xamarin Studio.
  • Herramientas como Xamarin Inspector.
  • Xamarin UITests y Xamarin Test Cloud.
  • Xamarin Insights.

Además se comentaron los últimos movimientos importantes como la compra de Xamarin por parte de Microsoft y las siguientes fechas de peso, //BUILD 2016 y Evolve 2016. El objetivo final era que todos los asistentes conocieran el aporte de Xamarin desde las herramientas al desarrollo pasando por sus servicios.

La presentación utilizada la tenéis disponible en este enlace. En cuanto a las demos técnicas realizadas, las tenéis disponible en GitHub:

Ver GitHub

Quisiera terminar añadiendo algunos agradecimientos a Alejandro Campos y Marcos Cobeña por participar junto a un servidor en las sesiones, gracias a todas las comunidades .NET de Sevilla y por supuesto, muchas gracias a todos los asistentes.

Más información

[Xamarin.Forms] Optimizando listados con estrategias de cacheo

JumpListXamarin.Forms 2.0

Con la llegada de Xamarin 4 han aterrizado una gran cantidad de diversas novedades entre las que destaca la versión 2.0 de Xamarin Forms. Entre las novedades principales contamos con:

  • Soporte a UWP.
  • Compilación de XAML (XAMLC).
  • Optimización en Layouts.
  • Optimización de listados. Incluidas nuevas estrategias de cacheo.
  • Corrección de bugs.

Optimizando listados

Entre el listado de controles fundamentales de cualquier aplicación, junto a textos, cajas de textos y botones, destacaríamos los listados. Es un control muy habitual en la inmensa mayoría de aplicaciones.

Como hemos visto en el listado de novedades de Xamarin.Forms 2.0, se han introducido mejoras en el rendimiento del control listView incluyendo nuevas estrategias de cacheo.

Estrategias de cacheo

A menudo, en listados debemos soportar grandes cantidades de elementos muy superiores a lo que se puede mostrar en pantalla e incluso a lo que se puede alcanzar con un ligero scroll. Esto impacta negativamente en el rendimiento. Tanto en iOS como en Android contamos con mecanismos de reciclado de celdas que permiten solucionar o mitigar este problema. La técnica consiste en contar solo en memoria con una pequeña cantidad de celdas en memoria de modo que se van reciclando y reutilizando elementos según el usuario realiza scroll.

Con la llegada de Xamarin.Forms 2.0 podemos aprovechar estas características nativas desde Forms. El control ListView recibe una nueva propiedad llamada CachingStrategy para esteblecer el tipo de cacheo realizado. Soporta uno de los siguientes valores:

  • RetainElement: Comportamiento por defecto. Genera una celda diferente por cada elemento del listado. Es recomendable su uso en caso de gran cantidad de cambios en el contexto. Sin embargo, hay que tener en cuenta que el código de inicialización de cada celda se ejecutará por cada celda pudiendo afectar al rendimiento.
  • RecycleElement: Esta opción toma ventajas de los mecanismos nativos de iOS y Android para el reciclado de celdas. Recomendable su uso cuando las celdas no tienen grandes cambios de contexto y su layout es similar. Reduce el consumo de memoria y la rapidez de uso.

Para realizar pruebas de rendimiento, crearemos un sencillo ejemplo con un listado con un número elevado de elementos (monos). En nuestra ViewModel creamos un listado:

[sourcecode language="vb"]
public ObservableCollection<Monkey> Monkeys
{
     get { return _monkeys; }
     set
     {
          _monkeys = value;
          RaisePropertyChanged();
     }
}
[/sourcecode]

Creamos un listado aleatorio de 1000 elementos:

[sourcecode language="vb"]
_count = 1;
Random random = new Random();
for (int i = 0; i < 1000; i++)
{
     Monkeys.Insert(0,
          new Monkey
          {
               Name = string.Format("Monkey {0}", _count),
               Location = Countries[random.Next(0, Countries.Count)],
               Photo = Images[random.Next(0, Images.Count)]
          });
     _count++;
}
[/sourcecode]

En la interfaz, utilizamos el control ListView utilizando el reciclado de celdas:

[sourcecode language="vb"]
<ListView
     ItemsSource="{Binding Monkeys}"
     CachingStrategy="RecycleElement">
     <ListView.ItemTemplate>
      <DataTemplate>
        <ViewCell>
          <StackLayout Orientation="Vertical">
            <StackLayout Orientation="Horizontal">
              <Image Source="{Binding Photo}"
                     Aspect="AspectFill"
                     WidthRequest="100"/>
              <Label Text="{Binding Name}"
                     VerticalOptions="Center"/>
              <Label Text="{Binding Location}"
                     HorizontalOptions="EndAndExpand"
                     VerticalOptions="Center"/>
            </StackLayout>
          </StackLayout>
        </ViewCell>
      </DataTemplate>
     </ListView.ItemTemplate>
</ListView>
[/sourcecode]

El resultado:

Reciclando celdas
Reciclando celdas

Tenéis el código fuente disponible en GitHub:

Ver GitHub

Recordad que podéis dejar cualquier comentario, sugerencia o duda en los comentarios.

Más información

Seville Microsoft Communities Day

hero-estuUniversity Tour 2016

El próximo 10 de Marzo en la Escuela Superior de Informática de Sevilla tiene lugar el University Tour 2016. Un evento diseñado tanto para estudiantes como para profesores donde se enseñan las tecnologías que más se usan a día de hoy. Aspectos como la gestión del ciclo de vida del software con metodologías ágiles, como hacer un desarrollo para todas las plataformas móviles que se usan actualmente, o como aprovechar todos los recursos que la nube pone a nuestra disposición.

Comunidades técnicas .NET Sevilla

En Sevilla contamos con grandes profesionales y empresas focalizadas en el trabajo en diferentes vertientes utilizando .NET y tecnologías Microsoft. No es de extrañar, que ante tantas variedades, inquietudes y opciones se cuente con una gran diversidad de comunidades técnicas relacionadas con tecnologías Microsoft.

El evento

El día 09 de Marzo las comunidades técnicas .NET de Sevilla aprovechando la presencia de compañeros de DX de Microsoft, vamos a organizar un evento con la siguiente agenda:

• 19:00h – 20:15h Pero… C# no es un lenguaje de programación funcional, ¿verdad? por Alejandro Campos.

C# es un lenguaje de programación multi-paradigma que soporta expresiones lambda desde el año 2007, y al que se le han ido añadiendo muchas características de programación funcional durante los últimos 10 años. Conoce C# 6.0, y cómo se ha convertido en uno de los mejores lenguajes de programación gracias a todas estas características. Aunque lleves años desarrollando con este lenguaje, esta sesión puede cambiarte la manera de utilizarlo de ahora en adelante.

• 20:15h – 21:00h Creando aplicaciones multiplataforma con Xamarin por Javier Suárez y Marcos Cobeña.

En esta sesión conoceremos todas las posibilidades que ofrece Xamarin para crear aplicaciones móviles nativas multiplataforma. Además, revisaremos principales herramientas y servicios destinados a mejorar nuestra productividad o búsqueda de la calidad.

¿Te apuntas?

El lugar

El evento se celebrará en la ETS de Ingeniería Informática. Dirección detallada:

E.T.S. Ingeniería Informática – Universidad de Sevilla
Av. Reina Mercedes s/n
Sevilla Se 41012

Más información