Gestione delle sessioni con Firestore

Molte app richiedono la gestione delle sessioni per l'autenticazione e le preferenze utente. ASP.NET Core è dotato di middleware per archiviare le sessioni in una cache distribuita.

La cache distribuita predefinita di ASP.NET non è in realtà distribuita. Archivia i dati di sessione nella memoria del server web. Quando un solo web server gestisce un sito web, questa strategia è valida. Tuttavia, quando molti server web gestiscono un sito web, gli utenti del sito web possono riscontrare errori e perdita di dati.

Per evitare errori e perdita di dati, un'app ASP.NET deve utilizzare una cache distribuita che archivia i dati in un datastore persistente. Questo tutorial mostra come gestire le sessioni su Cloud Run memorizzandole in Firestore e criptando i cookie con Cloud Key Management Service.

Obiettivi

  • Esegui il deployment dell'app su Cloud Run.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi.

I nuovi utenti di Google Cloud potrebbero avere diritto a una prova senza costi.

Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per saperne di più, consulta Esegui la pulizia.

Prima di iniziare

  1. Accedi al tuo account Google Cloud . Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

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

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

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

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  8. Per creare un database Firestore in modalità Native, segui questa procedura:
    1. Nella console Google Cloud , vai alla pagina Visualizzatore Firestore.
      Vai al visualizzatore Firestore
    2. Dalla schermata Seleziona una modalità di Cloud Firestore, fai clic su Seleziona modalità Native.
    3. Seleziona una località per il tuo database Firestore. La località impostata corrisponde alla località predefinita delle risorse Google Cloud per il tuo progetto Google Cloud . Questa località viene utilizzata per i servizi nel tuo progetto che richiedono un'impostazione della località, in particolare il bucket Cloud Storage predefinito e l'app App Engine.
    4. Fai clic su Crea database.
  9. In Cloud Shell, apri il codice sorgente dell'app.
    Vai a Cloud Shell

    Cloud Shell fornisce l'accesso da riga di comando alle tue risorse Google Cloud direttamente dal browser.

  10. Per scaricare il codice di esempio e modificarlo nella directory dell'applicazione, fai clic su Continua.
  11. In Cloud Shell, configura gcloud CLI in modo da utilizzare il nuovo progetto Google Cloud :

    # Configure gcloud for your project
    gcloud config set project PROJECT_ID

    Sostituisci PROJECT_ID con l'ID del progetto Google Cloud che hai creato utilizzando la console Google Cloud .

    Google Cloud CLI è il metodo principale per interagire con le risorse Google Cloud dalla riga di comando. In questo tutorial utilizzerai gcloud CLI per eseguire il deployment dell'app e per monitorarla.

Esaminare il codice sorgente

Il seguente diagramma illustra come Firestore gestisce le sessioni per l'app Cloud Run.

Diagramma dell'architettura: utente, Cloud Run, Firestore.

Il metodo ConfigureServices nel file Startup.cs configura l'app per utilizzare Cloud KMS per la crittografia e Cloud Storage per archiviare le chiavi criptate.

  1. In Cloud Shell, fai clic su avvia editor per avviare l'editor ed esaminare il file 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();
    }
    

Configurazione del progetto Google Cloud

  1. Nell'editor di Cloud Shell, modifica il file appsettings.json e sostituisci le due istanze di YOUR-PROJECT-ID con l'ID del tuo progetto Google Cloud . Salva il file.

    {
      "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 nuovo portachiavi Cloud Key Management Service denominato dataprotectionprovider:

    gcloud kms keyrings create dataprotectionprovider --location global

  3. Crea una nuova chiave Cloud Key Management Service denominata masterkey:

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

  4. Crea un bucket Cloud Storage per archiviare le chiavi criptate:

    gcloud storage buckets create gs://PROJECT_ID-bucket

Deployment ed esecuzione su Cloud Run

Puoi utilizzare Cloud Run per creare ed eseguire il deployment di un'app che funziona in modo affidabile anche se sottoposta a un carico elevato e con grandi quantità di dati.

Questo tutorial utilizza Cloud Run per eseguire il deployment del server.

  1. In Cloud Shell, pubblica l'app:

    dotnet publish -c Release
    
  2. Utilizza Cloud Build per creare un container Docker e pubblicarlo in Container Registry:

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

  3. Esegui il container con Cloud Run:

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

    Prendi nota dell'URL nell'output:

    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. Per visualizzare l'app live, vai all'URL che hai copiato nel passaggio precedente.

Eliminazione delle sessioni

Puoi eliminare i dati di sessione nella console Google Cloud o implementare una strategia di eliminazione automatica. Se utilizzi soluzioni di archiviazione per le sessioni come Memcache o Redis, le sessioni scadute vengono eliminate automaticamente.

Esecuzione del debug dell'app

Se non riesci a connetterti alla tua app Cloud Run, controlla quanto segue:

  1. Verifica che i comandi di deployment gcloud siano stati completati correttamente e non abbiano generato errori. Se si sono verificati errori (ad esempio, message=Build failed), correggili e prova a eseguire di nuovo il deployment dell'app Cloud Run.
  2. Consulta la guida di Cloud Run alla visualizzazione dei log.

Esegui la pulizia

Elimina il progetto

  1. Nella console Google Cloud , vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona quello che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Passaggi successivi