Manejar sesiones con Firestore


Muchas aplicaciones necesitan la administración de sesiones para la autenticación y las preferencias del usuario. ASP.NET Core incluye middleware para almacenar sesiones en una caché distribuida.

La caché distribuida predeterminada de ASP.NET no se distribuye en absoluto. Almacena datos de sesión en la memoria del servidor web. Cuando solo un servidor web entrega un sitio web, esta estrategia es adecuada. Pero cuando muchos servidores web entregan un sitio web, los usuarios pueden experimentar errores y perder datos.

Para evitar errores y datos perdidos, una aplicación ASP.NET debe usar una caché distribuida que almacene datos en un almacén de datos persistente. En este instructivo, se muestra cómo administrar sesiones en Cloud Run si las almacenas en Firestore y encriptas las cookies con Cloud Key Management Service.

Objetivos

  • Implementa la aplicación en Cloud Run.

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Firestore, Cloud Run, Cloud Key Management Service, and Cloud Storage APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Firestore, Cloud Run, Cloud Key Management Service, and Cloud Storage APIs.

    Enable the APIs

  8. Para crear una base de datos de Firestore en modo nativo, sigue los pasos a continuación:
    1. En la consola de Google Cloud, ve a la página Visualizador de Firestore.
      Ir al visualizador de Firestore
    2. Desde la pantalla Seleccionar un modo de Firestore, haz clic en Seleccionar modo nativo.
    3. Selecciona una ubicación para tu base de datos de Firestore. Esta configuración de la ubicación es la ubicación de recursos de Google Cloud predeterminada para tu proyecto de Google Cloud. La ubicación se usa para los servicios de Google Cloud en tu proyecto de Google Cloud que requieren una configuración de la ubicación, en particular, tu bucket predeterminado de Cloud Storage y tu aplicación de App Engine.
    4. Haga clic en Crear base de datos.
  9. En Cloud Shell, abre el código fuente de la app.
    Ir a Cloud Shell

    Cloud Shell brinda acceso de línea de comandos a tus recursos de Google Cloud de forma directa desde el navegador.

  10. Para descargar el código de muestra y cambiar al directorio de la app, haz clic en Continuar.
  11. En Cloud Shell, configura gcloud CLI para que use tu proyecto de Google Cloud nuevo de la siguiente manera:

    # Configure gcloud for your project
    gcloud config set project PROJECT_ID
    

    Reemplaza PROJECT_ID por el ID del proyecto de Google Cloud que creaste mediante la consola de Google Cloud.

    Google Cloud CLI es la forma principal en la que interactúas con tus recursos de Google Cloud desde la línea de comandos. En este instructivo, usarás gcloud CLI para implementar y supervisar tu app.

Examina el código fuente

En el siguiente diagrama, se ilustra cómo Firestore maneja las sesiones para la aplicación Cloud Run.

Diagrama de arquitectura: usuario, Cloud Run, Firestore.

El método ConfigureServices en el archivo Startup.cs configura la app para que use Cloud KMS en la encriptación, y Cloud Storage para almacenar claves encriptadas.

  1. En Cloud Shell, haz clic en Iniciar editor para iniciar el editor y examinar el archivo Startup.cs.

    public void ConfigureServices(IServiceCollection services)
    {
        // Antiforgery tokens require data protection.
        services.AddDataProtection()
            // Store keys in Cloud Storage so that multiple instances
            // of the web application see the same keys.
            .PersistKeysToGoogleCloudStorage(
                Configuration["DataProtection:Bucket"],
                Configuration["DataProtection:Object"])
            // Protect the keys with Google KMS for encryption and fine-
            // grained access control.
            .ProtectKeysWithGoogleKms(
                Configuration["DataProtection:KmsKeyName"]);
        services.AddFirestoreDistributedCache(
                Configuration["FIRESTORE_PROJECT_ID"])
            .AddFirestoreDistributedCacheGarbageCollector();
        services.AddSession();
    }
    

Configura el proyecto de Google Cloud

  1. En el editor de Cloud Shell, edita el archivo appsettings.json y reemplaza las dos instancias de YOUR-PROJECT-ID por el ID de tu proyecto de Google Cloud. Guarda el archivo.

    {
      "Logging": {
        "LogLevel": {
          "Default": "Warning"
        }
      },
      "AllowedHosts": "*",
      "DataProtection": {
        "Bucket": "YOUR-PROJECT-ID-bucket",
        "Object": "DataProtectionProviderKeys.xml",
        "KmsKeyName": "projects/YOUR-PROJECT-ID/locations/global/keyRings/dataprotectionprovider/cryptoKeys/masterkey"
      }
    }
    
  2. Crea un llavero de claves nuevo de Cloud Key Management Service llamado dataprotectionprovider:

    gcloud kms keyrings create dataprotectionprovider --location global

  3. Crea una clave nueva de Cloud Key Management Service llamada masterkey:

    gcloud kms keys create masterkey --location global --keyring dataprotectionprovider --purpose=encryption

  4. Crea un bucket de Cloud Storage para almacenar las claves encriptadas:

    gsutil mb gs://PROJECT_ID-bucket

Implementa y ejecuta en Cloud Run

Puedes usar Cloud Run para crear y, luego, implementar una aplicación que se ejecute de manera confiable bajo una gran carga y con grandes cantidades de datos.

En este instructivo, se usa Cloud Run para implementar el servidor.

  1. En Cloud Shell, publica tu aplicación:

    dotnet publish -c Release
    
  2. Usa Cloud Build para compilar un contenedor de Docker y publicarlo en Container Registry:

    gcloud builds submit --tag gcr.io/PROJECT_ID/sessions bin/Release/netcoreapp2.1/publish

  3. Ejecuta el contenedor con Cloud Run:

    gcloud beta run deploy sessions --region us-central1 --platform managed --image gcr.io/PROJECT_ID/sessions --allow-unauthenticated

    Toma nota de la URL en el resultado:

    Service [sessions] revision [sessions-00003-xiz] has been deployed and is serving
    100 percent of traffic at https://sessions-r3f3em7nuq-uc.a.run.app
  4. Para ver la app en vivo, ve a la URL que copiaste en el paso anterior.

Borra sesiones

Puedes borrar los datos de sesión en la consola de Google Cloud o implementar una estrategia de eliminación automática. Cuando usas soluciones de almacenamiento para sesiones, como Memcache o Redis, las sesiones vencidas se borran de forma automática.

Depura la app

Si no puedes conectarte a la aplicación Cloud Run, verifica lo siguiente:

  1. Comprueba que los comandos de implementación de gcloud se completaron correctamente y no generaron ningún error. Si hubo errores (por ejemplo, message=Build failed), corrígelos y, luego, intenta implementar la aplicación Cloud Run nuevamente.
  2. Consulta la guía de Cloud Run para ver los registros.

Limpia

Borra el proyecto

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

¿Qué sigue?