Gestione delle sessioni con Firestore


Molte app richiedono la gestione della sessione per l'autenticazione e le preferenze utente. Il core ASP.NET include middleware per archiviare le sessioni in una cache distribuita.

La cache distribuita predefinita di ASP.NET non è in alcun modo distribuita. Archivia i dati delle sessioni nella memoria del server web. Quando un solo server web gestisce un sito web, questa strategia va bene. Tuttavia, quando molti server web gestiscono un sito web, gli utenti di quest'ultimo potrebbero riscontrare errori e perdere dati.

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

Obiettivi

  • Eseguire il deployment dell'app su Cloud Run.

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi basata sull'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

Al termine delle attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.

Prima di iniziare

  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. 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à Firestore, fai clic su Seleziona modalità nativa.
    3. Seleziona una località per il tuo database Firestore. Questa impostazione di località corrisponde alla località predefinita della risorsa Google Cloud per il tuo progetto Google Cloud . Questa località viene utilizzata per i servizi Google Cloud all'interno del tuo progetto Google Cloud che richiede la geolocalizzazione. Nello specifico, si tratta del tuo bucket predefinito di Cloud Storage e della tua 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 tramite 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 tuo nuovo progetto Google Cloud:

    # Configure gcloud for your project
    gcloud config set project PROJECT_ID
    

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

    Google Cloud CLI è il metodo principale per interagire con le tue risorse Google Cloud dalla riga di comando. In questo tutorial utilizzerai l'interfaccia alla gcloud CLI per eseguire il deployment e monitorare l'app.

Esaminare il codice sorgente

Il seguente diagramma illustra il modo in cui 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 l'utilizzo di 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 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 keyring Cloud Key Management Service denominato dataprotectionprovider:

    gcloud kms keyrings create dataprotectionprovider --location global

  3. Crea una nuova chiave di 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:

    gsutil mb gs://PROJECT_ID-bucket

Deployment ed esecuzione su Cloud Run

Puoi utilizzare Cloud Run per creare ed eseguire il deployment di un'app che può essere eseguita in modo affidabile sotto carichi pesanti e con grandi quantità di dati.

Questo tutorial utilizza Cloud Run per il deployment del server.

  1. In Cloud Shell, pubblica la tua app:

    dotnet publish -c Release
    
  2. Utilizza Cloud Build per creare un container Docker e pubblicare su 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 pubblicata, vai all'URL che hai copiato dal passaggio precedente.

Eliminazione di sessioni

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

Debug dell'app

Se non riesci a connetterti all'app Cloud Run, controlla quanto segue:

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

Esegui la pulizia

Elimina il progetto

  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.

Passaggi successivi