Securizar aplicaciones Windows Phone 8 con ACS

Siguiendo con la serie de post sobre gestión de identidad y seguridad basada en claims, después de ver cómo es posible securizar aplicaciones Windows 8, en esta entrada toca hablar de Windows Phone 8.

Para este ejemplo partimos de post anterior, dónde veíamos cómo usar WebAutenticationBroker para securizar aplicaciones Windows 8, y los cambios que debíamos hacer en nuestro servicio WebAPI para generar el token que autenticación.

En Windows Phone 8 NO tenemos disponible la librería Windows Autentication Library (AAL), ni tampoco el WebAutenticationBroker, pero aún así, veremos cómo el código a realizar es bastante sencillo.

Después de crear una aplicación de ejemplo de Windows Phone 8 en Visual Studio, crearemos una nueva página llamada SignIn.xaml dónde meteremos la lógica de autenticación. En la página principal de nuestra aplicación podemos añadir la lógica necesaria para que si el usuario no está autenticado, se le lleve a esta página.

La página de SingIn lo único que va a tener es un control WebBrowser, que será el encargado de mostrar la página de autenticación del proveedor o proveedores de identidad que tengamos configurados en Windows Azure Access Control.

WP8ACS1

En la página sólo tendremos que código, para que en el webrowser se vea la ventana de login del proveedor de identidad.

Fijaros en que la URL que mostramos es exactamente la misma que usábamos en el ejemplo de Windows 8 con WebAuthenticationBroker. Al igual que el ejemplo anterior, el namespace del ACS es “estoyenlanube”, mientras que el servicio WebAPI lo tengo desplegado en https://estoyenlanube.azurewebsites.net. Lo tengo desplegamos en un servidor real porque ACS no es capaz de redirigir a direcciones localhost.

public SignIn()
{
    InitializeComponent();

    signInBrowser.IsScriptEnabled = true;

}

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    base.OnNavigatedTo(e);

    string authURL = string.Format(
        "https://estoyenlanube.accesscontrol.windows.net:443/v2/wsfederation?wa=wsignin1.0&wtrealm=https://estoyenlanube.azurewebsites.net/&wreply=https://estoyenlanube.azurewebsites.net/api/federation");

    //navigate to it
    signInBrowser.Navigate(new Uri(authURL));
}

Con este código mostramos la ventana de login, pero una vez autenticado tenemos que ser capaces de coger el token de autenticación para poder usarlo en las llamadas a nuestro servicio WebAPI. Para ello usaremos el evento Naviagating para llamar cuando el navegador va a la URL que le hemos que tiene que redirigir una vez autenticado. El token lo obtenemos de la misma manera que el ejemplo de Windows 8.

private void Navigating(object sender, NavigatingEventArgs e)
{
    string returnURL = e.Uri.ToString();
    if (returnURL.StartsWith("https://estoyenlanube.azurewebsites.net/api/federation/end"))
    {
        e.Cancel = true;
        signInBrowser.Visibility = System.Windows.Visibility.Collapsed;
        var token = returnURL.Substring(returnURL.IndexOf("token=", StringComparison.Ordinal) + 6);
        DoGet(token);
    }
}

async Task DoGet(string token)
{
    HttpClient httpClient = new HttpClient();
    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Authorization", "Bearer " + token);

    var response = await httpClient.GetStringAsync(https://estoyenlanube.azurewebsites.net/api/values);
}

Ibon Landa

bon Landa lleva más de 15 años dedicado al desarrollo de software. Durante este tiempo ha trabajado en diferentes empresas en las cuáles ha podido trabajar en diferentes entornos y tecnologías. Actualmente está focalizado principalmente en tareas de desarrollo, arquitectura, en las herramientas del ciclo de vida y en todo lo relacionado con la plataforma de Cloud Computing Microsoft Azure, área en el que ha sido reconocido como MVP. Participa de forma activa en la comunidad, escribiendo su blog, manteniendo un portal sobre Microsoft Azure y colaborando con Microsoft y grupos de usuarios en eventos de formación, talleres y giras de producto.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *