Mobile App: Xamarin Forms Azure AD Authentication

En mi anterior post vimos como realizar la autenticación en una aplicación de Apache Cordova mediante Azure Mobile Apps. En este post vamos a ver como hacerlo en Xamarin Forms pero solo en Android.

Para empezar necesitamos tener creado un servicio Azure Mobile Apps con la Autenticación de AD activada, en mi anterior post podéis ver como crearlo paso a paso.

Para seguir el ejemplo con facilidad os recomiendo os bajéis primero el código del Github.

Una vez creado, creamos un proyecto de Xamarin Forms en VS2015 Update 3.

selectexportsql

Una vez creado el proyecto añadimos la referencia de Azure Mobile Client SDK

selectexportsql

Para cada proyecto necesitaremos implementar su propio método de autenticación, para ello, lo que hacemos es lo siguiente:

En App.cs (portable class) creamos un método static Init donde le pasaremos una Interface que implementaran todos los proyectos:

public class App : Application
{
   public static IAuthenticate Authenticator { get; private set; }
 
   public static void Init(IAuthenticate authenticator)
   {
       Authenticator = authenticator;
   }
   ....
}

La Interface IAuthenticate tiene la siguiente definición:

public Interface IAuthenticate
{
    Task<bool> Authenticate();
}

Ahora añadimos un button e implementamos el evento Clicked, para el ejemplo yo he implementado una clase ButtonCodePage.

class ButtonCodePage : ContentPage
{
   public ButtonCodePage()
   {
      Button button = new Button
      {
        Text = String.Format("Login Azure ADd"),
      };
      button.Clicked += async (sender, args) =>
      {
        if (App.Authenticator != null)
        {
           var auth = await App.Authenticator.Authenticate();
        }
      }; 
            this.Content = button;
   }
 }

Ahora lo siguiente que debemos hacer es ir al proyecto de Android a MainActivicy.cs, hacer que implemente la Interface IAuthenticate e implementar el método de autenticación:

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity, IAuthenticate
{  
  private MobileServiceUser user;
 
  public async Task<bool> Authenticate()
  {
    var success = false;
    var message = string.Empty;
    try
    {
         // Sign in with Azure AD login using a server-managed flow. 
         user = await ServiceManager.DefaultManager.CurrentClient.LoginAsync(this, MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory);
         if (user != null)
         {
        message = string.Format("you are now signed-in is {0}.", user.UserId);
          }
    }
    catch (Exception ex)
    {
       message = ex.Message;
    }
 
    // Display the success or failure message.
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.SetMessage(message);
    builder.SetTitle("Sign-in result");
    builder.Create().Show();
 
    return success;
 }
 
 protected override void OnCreate(Bundle bundle)
 {
    base.OnCreate(bundle);
    Xamarin.Forms.Forms.Init(this, bundle);
    //Inicializamos nuestra Xamarin App con la autenticación de Android
    App.Init((IAuthenticate)this);
    LoadApplication(new App());
 }
}

En el código anterior hay varios puntos a aclarar:

  • ServiceManager –> es una clase en la librería portable que nos ayuda a crear y consumir el cliente de MobileServiceClient.
public class ServiceManager
{
   static ServiceManager defaultInstance = new ServiceManager();
   MobileServiceClient client;
 
   private ServiceManager()
   {
      this.client = new MobileServiceClient("https://yourmobileapp.azurewebsites.net");
   }
 
   public MobileServiceClient CurrentClient
   {
      get { return client; }
   }
 
   public static ServiceManager DefaultManager
   {
       get
       {
          return defaultInstance;
       }
       private set
       {
          defaultInstance = value;
        }
    } 
 }
  • Otro punto a comentar es :
user = await ServiceManager.DefaultManager.CurrentClient.LoginAsync(this, MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory);

Como podéis observar en MobileServiceAuthenticationProvider hemos seleccionado la opción deseada, en este caso WindowsAzureActiveDirectory.

  • Por último en el método OnCreate hemos añadido la siguiente instrucción:
App.Init((IAuthenticate)this); 

Lo que estamos haciendo es iniciar la autenticación de nuestra App con la configuración de Android.

Ahora podemos ver los resultados ejecutando nuestra aplicación:

selectexportsql

selectexportsql

selectexportsql

Conclusiones

Como habéis podido ver es muy fácil poder utilizar la autenticación de Azure Mobile Apps para nuestra apps.

Cierto es, que requiere un poco más de trabajo que en Apache Cordova, dado que en Xamarin se debe implementar plataforma a plataforma, pero al final son muy pocas lineas de código que no tienen un impacto notable en el desarrollo y el mantenimiento.

¡Espero os haya gustado!

Referencias:

https://azure.microsoft.com/en-us/documentation/articles/app-service-mobile-xamarin-forms-get-started-users/

https://developer.xamarin.com/guides/xamarin-forms/web-services/authentication/azure/

[Total: 1    Average: 5/5]

Published by

rbermejo

Ingeniero informático y apasionado de la tecnología, sobre todo apasionado del cloud. Desarrollo mi carrera profesional en Sogeti España,SLU como .Net Architect, Team Lead, Mobility Lead & Azure Lead.

Leave a Reply

Your email address will not be published. Required fields are marked *