Modificar el tiempo de vida del token proporcionado por Windows Azure AppFabric Access Control


Cuando nuestras aplicaciones trabajan con Access Control, el mismo nos facilita un token que nos permite mantener la autenticación vigente durante el trascurso de nuestro paso por la aplicación. Sin embargo, al cabo de 10 minutos este token dejará de ser válido, solicitando un nuevo token al servicio de forma casi “transparente” para el usuario: Cuando se realice una nueva petición y nuestro token haya caducado, la aplicación se redirigirá nuevamente a nuestro servicio de Access Control utilizando el usuario y la contraseña que utilizamos en nuestro login, validando nuestras credenciales y obteniendo un nuevo token para los próximos 10 minutos.

El “problema” surge cuando tenemos una aplicación con ciertas consultas asíncronas que no utilizan el refresco total de la página y no son capaces de redirigirnos a Access Control para revalidar nuestras credenciales. En mi caso es bastante molesto que el usuario sólo tenga 10 minutos hasta la próxima comprobación por lo que voy a mostrar en este post como aumentar este tiempo de vida de nuestro token :D

Dentro de la administración de Access Control, accedemos al apartado Relaying Party applications.

Seleccionamos la aplicación que queremos modificar y nos posicionamos en el apartado Token lifetime (secs)

Este campo tiene que tener siempre un valor mayor a cero pero menor o igual a 24 horas. Como 10 minutos me parece escaso y 24 horas me parece una salvajada :D voy a modificar el mismo para que tenga una validez de media hora, o lo que es lo mismo 1800 segundos.

Por otro lado, si queremos que nuestra aplicación valide nuestras credenciales en el tiempo estimado podemos comprobar lo siguiente: En mi caso, utilizando JQuery me he dado cuenta de siempre recibo el mismo código de error en este supuesto, utilizando en mi llamada $.ajax el método error para capturarlo:

error: function (msg) {
    alert(msg.status); //code error: 12017
}

Sabiendo esto podemos determinar que nuestro token ha expirado y es necesario refrescar la página para recuperar un nuevo token. Para ello bastaría con lo siguiente:

error: function (msg) {
     switch (msg.status) {
          case 12017:
              location.reload();
          default:
                 alert(msg.status);
     }
}

De esta forma nos aseguramos que el token ha sido revalidado y que las actualizaciones a través de AJAX sigan funcionando sin problemas :D

¡Saludos!

Aumentar el timeout en las operaciones al servicio de blobs de Windows Azure Storage

Cuando subimos archivos de un tamaño considerable a Windows Azure Storage es posible que el timeout por defecto quizás se nos quede corto :( Si hacemos las llamadas directamente a través de la API REST el timeout por defecto son 30 segundos. Por el contrario, Storage Client amplia el mismo hasta 90 segundos, lanzando una excepción si no recibe respuesta.

En el segundo supuesto, con Storage Client, existen dos formas de modificar el tiempo de timeout: a nivel global o individual.

Modificación del timeout a nivel global

Si lo que queremos es que todas nuestras operaciones al sistema de blobs tenga el mismo timeout, debemos modificar el mismo al nivel de objeto CloudBlobClient.

private readonly CloudStorageAccount _storageAccount;

public CloudStorageBlob(CloudStorageAccount storageAccount)
{
    _storageAccount = storageAccount;
}

public CloudBlobContainer GetContainerReference(string containerName)
{
    var blobClient = _storageAccount.CreateCloudBlobClient();

    blobClient.Timeout = new TimeSpan(1, 0, 0);

    var container = blobClient.GetContainerReference(containerName);
    container.CreateIfNotExist();

    return container;
}

Como podéis ver en el código anterior, al objeto blobClient le modificamos la propiedad Timeout a una hora ampliando así el tiempo de espera.

Modificación del timeout a nivel individual

En el caso de que solamente queramos modificar el tiempo de timeout para una operación en concreto, por ejemplo en la subida de archivos, podemos utilizar la sobrecarga que acepta el parámetro BlobRequestOptions de la siguiente forma:

public Uri UploadFileToBlob(CloudBlobContainer blobContainer, string blobAddress, Stream stream)
{
    var blob = blobContainer.GetBlobReference(blobAddress);
    blob.UploadFromStream(stream, new BlobRequestOptions { Timeout = new TimeSpan(1, 0, 0) });
    return blob.Attributes.Uri;
}

Espero que sea de utilidad :D

¡Saludos!

Aumentar el tiempo de invisibilidad o el contenido de un mensaje en Windows Azure Storage Queues

Una de las últimas funcionalidades añadidas al sistema de queues de Windows Azure Storage es la posibilidad de actualizar un mensaje añadido con anterioridad, lo cual facilita aún más el manejo de este sistema. Los dos valores que se pueden modificar son el tiempo de invisibilidad y el contenido del mensaje. En este post vamos a ver cómo modificar ambos :)

En el caso de la invisibilidad lo normal es que utilicemos un mecanismo de aviso antes de que el tiempo se agote. De esta forma sabremos que nos estamos demorando en el proceso que lleva a cabo nuestro proceso, un worker role por ejemplo, y que necesitamos ampliar el tiempo que ese mensaje va a estar oculto para que ningún otro hilo o worker role lo pueda recuperar y procesar de nuevo. Un buen candidato para gestionar el tiempo que nos queda sería el objeto de tipo Timer :D Para usarlo podríamos utilizar el siguiente ejemplo:

var timer = new Timer();
timer.Elapsed += IncreaseInvisibility;
timer.Interval = 3540000; timer.Enabled = true;

timer.Start();

Con las líneas anteriores lo que estamos estableciendo es el tiempo que debe pasar para que, a través del método IncreaseInvisibility, aumentemos el timeout de visibilidad, o lo que es lo mismo el tiempo de más que nuestro mensaje permanecerá invisible. El intervalo debe estar especificado en milisegundos. Para este ejemplo, cuando hayan transcurrido 3540000 milisegundos (59 minutos) se ejecutará el método IcreaseInvisibility para modificar el mensaje que está en curso. Una vez que tenemos establecido “cada cuánto” vamos a especificar “el qué”.

private void IncreaseInvisibility(object sender, ElapsedEventArgs e)
{
   _operationsQueue.UpdateMessage(_message, TimeSpan.FromMinutes(60), MessageUpdateFields.Visibility);
}

Para poder modificar la invisibilidad, necesitamos hacer uso del objeto de tipo CloudQueue (en este caso, almacenado en la variable _operationsQueue), del cual hemos recuperado anteriormente el mensaje a través de GetMessage. Utilizamos el nuevo método UpdateMessage donde debemos pasarle:

  1. El objeto de tipo CloudQueueMessage, del mensaje que queremos modificar.
  2. Un TimeSpan con el tiempo que queremos ampliar la invisibilidad
  3. El campo que queremos actualizar: MessageUpdateFields.Visibility.

Nota: El tiempo máximo de invisibilidad es de 7 días.

En el caso del contenido, se me ocurre que podría ser necesario modificarlo para un par supuestos:

  1. Reutilización de mensajes dentro de un mismo contexto.
  2. Corrección de un mensaje con parámetros inválidos (De esta forma podríamos modificar el contenido para que nuestra lógica sea capaz de detectar un mensaje erróneo y eliminarlo).

Para modificar pues el contenido de un mensaje podríamos hacerlo del siguiente modo:

private void UpdateContent(CloudQueue queue, CloudQueueMessage message)
{
   message.SetMessageContent("Delete");
   queue.UpdateMessage(message, TimeSpan.FromSeconds(1), MessageUpdateFields.Content);
}

En primer lugar modificamos el contenido del mensaje a través del método SetMessageContent. Por último, utilizamos el mismo método que en el apartado anterior, UpdateMessage, pero esta vez indicando en el último parámetro que vamos a modificar el contenido en vez de la invisibilidad.

Espero que sea de utilidad :D

¡Saludos!

Extraer los iconos del sistema operativo

Hay veces que para obtener una mayor familiaridad con una aplicación es necesario obtener los iconos que el propio sistema utiliza para la representación de imágenes, archivos comprimidos, etcétera. Es por ello que me surgió la necesidad de recuperar algunos de esos iconos que utiliza Windows para las extensiones conocidas por el sistema :) Estos están almacenados en un conjunto de DLLs en system32. Para poder extraer los archivos de tipo ico he utilizado una herramienta la mar de sencilla llamada Anolis_Resourcer_by_AnolisFX, la cual nos permite Exportar uno o varios iconos a través de un proceso bat.

Algunos de los iconos más necesitados se localizan en las siguientes DLLs:

  • %systemRoot%system32DDORes.dll
  • %systemRoot%system32shell32.dll
  • %systemRoot%system32wmp.dll
  • %systemRoot%system32imageres.dll
  • %systemRoot%system32ieframe.dll
  • %systemRoot%system32Display.dll

Espero que sea de utilidad :D

¡Saludos!

Utilizar Windows Azure AppFabric Caching como session provider

Una de las necesidades que necesitamos cubrir cuando trabajamos con granjas de servidores es la persistencia de la sesión en un lugar común para todas las instancias. Si bien Windows Azure AppFabric Caching está pensado para el almacenamiento de cache distribuido de alta velocidad, también podemos hacer uso del mismo para almacenar el estado de la sesión. En este post vamos a ver cuál sería la configuración para nuestra aplicación para hacer uso de este servicio.

Creación de un service namespace para Windows Azure AppFabric Caching

Antes de modificar nuestra aplicación, debemos dirigirnos al portal de Windows Azure. Dentro de él, nos posicionamos en Service Bus, Access Control & Caching que son los tres servicios disponibles a día de hoy dentro del apartado Windows Azure AppFabric.

En este espacio tenemos los tres servicios por separado. En este caso seleccionamos el producto Caching y hacemos clic en New en el menú superior para solicitar el alta de un sistema de caché dentro de nuestra subscripción.

En este momento nos aparecerá una nueva ventana donde nos facilitarán la creación de los tres servicios a la vez, bajo el mismo namespace, o bien únicamente de aquel que tengamos seleccionado.

Cuando queremos dar de alta una nueva cache debemos elegir, además del namespace y la región donde lo queremos ubicar, la cuota para el tamaño máximo de la misma, siendo 128MB el tamaño mínimo y 4GB el máximo. Para consultar la tabla de precios podemos ir a la siguiente dirección.

Modificación del archivo web.config con los valores de Windows Azure AppFabric Caching

Una vez que hayamos elegido todos los parámetros, el servicio puede tardar unos minutos en estar disponible para su uso (mientras tanto tendrá el estado Activating…). Cuando la activación haya finalizado, seleccionaremos el servicio para habilitar el menú superior y así poder hacer clic en View Client Configuration.

En estos momentos se cargará la configuración exacta para nuestro servicio, incluyendo la URL y el token asignado para la conexión. La forma de mostrárnosla será la siguiente:

Si nos fijamos bien en la información anterior, son fragmentos que debemos incrustar dentro del archivo web.config de nuestra aplicación. Hay que tener extremo cuidado al insertar cada fragmento en el lugar que le corresponde ya que de lo contrario el emulador ni siquiera será capaz de arrancar :) En dicha configuración está incluida más información de la que necesitamos en este post, ya que también está disponible la configuración para la funcionalidad output cache.

El primer apartado, configSections, es posible que ya se esté utilizando en la aplicación actual por lo que sólo sería necesario añadir la sección que contiene el mismo. De lo contrario, copiamos todo el apartado hasta el siguiente comentario y lo añadimos al archivo. Una vez que tenemos registrada esta sección, ya podemos hacer uso de dataCacheClient donde nos facilitan las dos posibilidades: uso simple y otra para conexiones a través de SSL. Elegimos la primera de ella o las dos en el caso de que aplique. Esta sección(es) debe estar al mismo nivel que configSections.

Por último, para session state, bastará con añadir dentro de la sección system.web el apartado sessionState donde se indica que vamos a utilizar el dataCacheClient con nombre default para almacenar la sesión. Por otro lado, nos indican que si utilizamos SSL deberemos cambiar este nombre por el nombre SslEndpoint que es el nombre dado por defecto al otro dataCacheClient mostrado en esta pantalla.

Añadir DLLs de Windows Azure AppFabric Caching

Para finalizar la configuración, necesitamos añadir a nuestro proyecto tres DLLs que hemos mencionado dentro del archivo de configuración:

  • Microsoft.ApplicationServer.Caching.Client
  • Microsoft.ApplicationServer.Caching.Core
  • Microsoft.Web.DistributedCache

Estas librerías están ubicadas en %programfiles%Windows Azure AppFabric SDKV1.5AssembliesNET4.0Cache y deben tener el atributo Copy Local a True.

Cuando realicemos pruebas con el emulador de Windows Azure Compute es necesario hacer un iisreset para que no tenga comportamientos extraños.

Espero que sea de utilidad :D

Session["despedida"] = “¡Saludos!”; :P