使用 Firestore 处理会话

许多应用需要用于身份验证和用户偏好设置的会话管理。ASP.NET Core 随附中间件,用于将会话存储在分布式缓存中。

实际上,ASP.NET 的默认分布式缓存根本没有分布。它将会话数据存储在网络服务器的内存中。当只有一个网络服务器在为一个网站提供服务时,此策略很好。但是,当许多网络服务器为一个网站提供服务时,该网站的用户可能会遇到错误和数据丢失。

为了避免错误和数据丢失,ASP.NET 应用必须使用将数据存储在永久性数据存储区中的分布式缓存。本教程介绍如何在 Cloud Run 上管理会话,方法是将会话存储在 Firestore 中并使用 Cloud Key Management Service 加密 Cookie。

目标

  • 在 Cloud Run 上部署应用。

费用

本教程使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用量来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本教程后,您可以删除所创建的资源以避免继续计费。如需了解详情,请参阅清理

准备工作

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册一个新帐号

  2. 在 Cloud Console 的项目选择器页面上,选择或创建 Cloud 项目。

    转到项目选择器页面

  3. 确保您的 Google Cloud 项目已启用结算功能。 了解如何确认您的项目已启用结算功能

  4. 启用 Firestore, Cloud Run, Cloud Key Management Service, and Cloud Storage API。

    启用 API

  5. 如需在原生模式下创建 Firestore 数据库,请完成以下步骤:
    1. 在 Cloud Console 中,转到 Firestore 查看器页面。
      转到 Firestore 查看器
    2. 选择 Firestore 模式屏幕中,点击选择原生模式
    3. 选择 Firestore 数据库的位置。 此位置设置是您的 Cloud 项目的默认 Google Cloud 资源位置。此位置将用于 Cloud 项目中需要位置设置的 Google Cloud 服务,具体地说,包括您的默认 Cloud Storage 存储分区和 App Engine 应用。
    4. 点击创建数据库
  6. 在 Cloud Shell 中,打开应用的源代码。
    转到 Cloud Shell

    利用 Cloud Shell,您可以直接在浏览器中通过命令行访问 Google Cloud 资源。

  7. 如需将示例代码和更改下载到应用目录,请点击继续
  8. 在 Cloud Shell 中,配置 gcloud 工具以使用新的 Google Cloud 项目:

    # Configure gcloud for your project
    gcloud config set project PROJECT_ID
    

    PROJECT_ID 替换为您使用 Cloud Console 创建的 Google Cloud 项目的 ID。

    gcloud 命令行工具是您从命令行与 Google Cloud 资源进行交互的主要方式。在本教程中,您将使用 gcloud 工具来部署和监控应用。

检查源代码

下图说明 Firestore 如何处理 Cloud Run 应用的会话。

架构图:用户、Cloud Run、Firestore。

Startup.cs 文件中的 ConfigureServices 方法将应用设置为使用 Cloud KMS 进行加密,并使用 Cloud Storage 存储加密的密钥。

  1. 在 Cloud Shell 中,点击 启动编辑器 以启动编辑器并检查 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();
    }
    

设置 Google Cloud 项目

  1. 在 Cloud Shell 编辑器中,编辑 appsettings.json 文件,并将 YOUR-PROJECT-ID 的两个实例替换为您的 Cloud 项目 ID。保存文件。

    {
      "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. 创建一个名为 dataprotectionprovider 的新 Cloud Key Management Service 密钥环:

    gcloud kms keyrings create dataprotectionprovider --location global

  3. 创建一个名为 masterkey 的新 Cloud Key Management Service 密钥:

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

  4. 创建一个 Cloud Storage 存储分区以存储加密的密钥:

    gsutil mb gs://PROJECT_ID-bucket

在 Cloud Run 上部署和运行

您可以使用 Cloud Run 来构建和部署可在负载繁重和具有大量数据的情况下可靠运行的应用。

本教程使用 Cloud Run 部署服务器。

  1. 在您的 Cloud Shell 中,发布您的应用:

    dotnet publish -c Release
    
  2. 使用 Cloud Build 来构建 Docker 容器并发布到 Container Registry:

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

  3. 使用 Cloud Run 运行容器:

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

    记下输出中的 网址:

    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. 要查看实时应用,请转到上一步中复制的网址。

删除会话

您可以在 Google Cloud Console删除会话数据,或实施自动删除策略。如果您为会话使用 Memcache 或 Redis 等存储解决方案,系统会自动删除已过期的会话。

调试应用

如果您无法连接到 Cloud Run 应用,请检查以下内容:

  1. 检查 gcloud 部署命令是否已成功完成,并且未输出任何错误。如果存在错误(例如 message=Build failed),请更正这些错误,然后重试部署 Cloud Run 应用
  2. 请参阅 Cloud Run 日志查看指南

清理

删除项目

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”页面

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤