Cómo usar el custom authentication de Azure Mobile Services .NET back-end

Trabajando con ZUMO .NET back-end tuve la necesidad de implementar una autenticación personalizada, es decir, que no sea con proveedores de terceros sino con usuarios y contraseñas que están en x base de datos. Afortunadamente para mi, Microsoft tiene esta documentación, así que no me esforzaré en reescribir lo que allí se explica. Lo que allí no comentan es el lío que hay con las versiones de los paquetes, cómo usar el token desde un cliente ni cómo obtenerla identidad del usuario en el lado del servidor.

TL;DR;

No actualicen la versión del System.IdentityModel.Tokens.Jwt Usar el header “X-ZUMO-AUTH” para pasar el token al servicio.

Líos con las versiones de los paquetes

Una vez creado el proyecto lo primero que hice fue actualizar los paquetes, hace falta agregar unos cuantos assembly binding redirects y cuando todos ya están listos falla con pantalla amarilla y  el error:

Method not found: 'Void System.IdentityModel.Tokens.JwtSecurityTokenHandler.set_CertificateValidator(System.IdentityModel.Selectors.X509CertificateValidator)'. 

Si ya la has cagado como yo, la solución esta en ejecutar dos comandos en el Package Manager Console:

> uninstall-package System.IdentityModel.Tokens.Jwt -Version 3.0.2 -Force
> uninstall-package System.IdentityModel.Tokens.Jwt -Version 4.0.1 -Force
> install-package System.IdentityModel.Tokens.Jwt -Version 3.0.2

En los comentarios de la entrada en inglés dicen que aparentemente la autenticación no se realiza por culpa de la versión de este paquete, pero en lo que probé parece que solo es lío de usar la cabecera correcta.

Cabecera de autenticación

Después de leer algo de la documentación no encontré nada que dijera algo sobre la cabecera X-ZUMO-AUTH y al hacer la búsqueda parece que no hay documentación oficial (Si encuentran algo no duden es comentarlo). La encontré después de leer algunos blogs. En fin, para poder usar el token de autenticación  hay que pasar la cabecera X-ZUMO-AUTH y no el Authorization. El token lo recuperamos haciendo un request a /customlogin/ y este será pasado a las acciones que requieran autenticación.   image   image   image

Obtener el usuario en el back-end

Aunque WAMS es una envoltura al rededor de ASP.NET WEB API y otros servicios, ciertamente hay cosas que cambian y aún no entiendo muy bien, cómo por qué cambia el Type del claim que guarda la identidad del usuario. Basta con hacer algo de debug para encontrarlo y recuperarlo de la forma:

    [AuthorizeLevel(AuthorizationLevel.User)]
    public class HelloController : ApiController
    {
        public IHttpActionResult Get()
        {
            var user = ClaimsPrincipal.Current.FindFirst(claim => claim.Type == "uid").Value;
            if (user.Contains(":")) user = user.Split(':')[1];
            return Ok("Hello! " + user);
        }
    }

Conectando con JavaScript

El proyecto en el que estoy trabajando en este momento requiere que desde un sitio web se invoquen ciertas acciones expuestas en el servicio móvil. Lo que nos pone ahora la tarea de solucionar el lío del cors. Por fortuna para nosotros desde la actualización 1.0.342 se usa  ASP.NET WEB API 2, y entre sus características está el trabajo con CORS, pero por supuesto, encapsuladas. Para usarla solo basta con agregar un nuevo appSetting en el web.config:

 
<add key="MS_CrossDomainOrigins" value="http://mysite.com" />

Con esto ya podemos llamar desde el cliente js:

 
        $.ajax({
            type: 'POST',
            contentType : "application/json",
            url: 'http://localhost:54085/api/customlogin',
            data: JSON.stringify(userModel)
        }).done(function (data) {
            sessionStorage.setItem('supertoken', data.authenticationToken);
            AppViewModels.assignVM.initView();
        }).fail(function() {
            alert("Usuario o contraseña invalidos");
        });

El código del ejemplo esta aquí

Espero les sea de utilidad.

Hasta el próximo post.

Anuncios
Cómo usar el custom authentication de Azure Mobile Services .NET back-end

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

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