Azure 托管 Redis 示例 - ASP.NET Core Web API

此示例演示如何使用 Microsoft Entra ID 身份验证通过 DefaultAzureCredential 流将 ASP.NET Core Web API 连接到 Azure 管理的 Redis。 应用程序避免传统的基于连接字符串的身份验证,转用基于令牌、Microsoft Entra ID 的访问,这符合现代安全最佳实践。

此应用程序是一个最小的 ASP.NET Core 8.0 Web API:

  1. 在启动时建立与 Azure 托管 Redis 的安全身份验证连接。
  2. 公开一个简单的 REST 终结点,用于读取和写入缓存中的数据。
  3. 使用依赖项注入演示正确的 Redis 连接生命周期管理。

跳转到 GitHub 查看代码

克隆 GitHub 上的 Microsoft.Azure.StackExchangeRedis 存储库。

先决条件

  • .NET 8.0 SDK
  • 在 Azure 订阅中预配的 Azure 托管 Redis 实例。
  • Azure 用户或服务主体必须作为 Redis 用户被添加到缓存中。 在 Azure 门户中,转到“资源”菜单上的 “身份验证 ”,选择 “用户或服务主体”,然后添加标识。
  • 用于本地开发身份验证的 Azure CLI

所需的 NuGet 软件包

Package 目的
Microsoft.Azure.StackExchangeRedis StackExchange.Redis 的扩展方法,支持通过 Microsoft Entra ID 令牌进行的 Azure 托管 Redis 身份验证
StackExchange.Redis 适用于 .NET 的基础 Redis 客户端库
Azure.Identity 提供 DefaultAzureCredential 和其他凭据类型以便通过 Azure 服务进行身份验证
Swashbuckle.AspNetCore 对 API 文档和测试的 Swagger/OpenAPI 支持

安装主包:

dotnet add package Microsoft.Azure.StackExchangeRedis

此包引入 StackExchange.RedisAzure.Identity 作为依赖项。

配置

应用程序从配置中读取 Redis 终结点。 更新appsettings.Development.json

{
  "Redis": {
    "Endpoint": "<your-redis-name>.<region>.redis.chinacloudapi.cn:10000"
  }
}

注释

Azure 托管 Redis 默认使用端口 10000 。 终结点格式如下 <cache-name>.<region>.redis.chinacloudapi.cn:10000

身份验证流程

本地开发

在本地运行应用程序之前,请使用 Azure 进行身份验证:

az login

自动获取DefaultAzureCredential的Azure CLI 凭据,并使用这些凭据获取 Redis 资源的访问令牌。 此方法无需在本地管理或轮换机密。

生产环境

在 Azure 托管的环境(如应用服务、容器应用和 AKS)中, DefaultAzureCredential 使用:

  • 托管标识 - 系统分配的或用户分配的
  • 工作负荷标识 - 适用于 Kubernetes 方案
  • 环境变量 - 用于服务主体身份验证

无需更改代码。 相同的 DefaultAzureCredential 无缝适应于环境。

Architecture

Redis 服务 (Services/Redis.cs

Redis 类管理连接生命周期:

var options = new ConfigurationOptions()
{
    EndPoints = { endpoint },
    LoggerFactory = _loggerFactory,
};

await options.ConfigureForAzureWithTokenCredentialAsync(new DefaultAzureCredential());

_connection = await ConnectionMultiplexer.ConnectAsync(options);

要点:

  • ConfigureForAzureWithTokenCredentialAsync是用于设置基于令牌的身份验证的扩展方法Microsoft.Azure.StackExchangeRedis
  • DefaultAzureCredential 自动处理令牌获取和刷新
  • 应用在启动时建立连接一次,并在请求之间共享连接

依赖项注入 (Program.cs

应用将 Redis 服务注册为单例,并在启动时对其进行初始化。

builder.Services.AddSingleton<Redis>();

// Initialize Redis connection
using (var scope = app.Services.CreateScope())
{
    var redis = scope.ServiceProvider.GetRequiredService<Redis>();
    var endpoint = app.Configuration.GetValue<string>("Redis:Endpoint");
    await redis.ConnectAsync(endpoint);
}

API 控制器 (Controllers/SampleController.cs

控制器注入 Redis 服务并演示基本缓存作:

  • GET /Sample:从缓存中读取上一次访问时间戳,并使用当前时间更新它

运行应用程序

  1. 确保已经过身份验证:

    az login
    
  2. appsettings.Development.json中更新 Redis 端点。

  3. 运行应用程序:

    dotnet run
    
  4. 前往 https://localhost:<port>/swagger 以访问 Swagger UI。

预期输出

调用 GET /Sample 终结点时:

第一个请求:

Previous visit was at: 
(Empty value since no previous visit exists)
**Subsequent requests:**
Previous visit was at: 2026-01-30T14:23:45
(Returns the ISO 8601 formatted timestamp of the previous request)

控制台日志显示:

info: Microsoft.Azure.StackExchangeRedis.Sample.AspNet.Controllers.SampleController
      Handled GET request. Previous visit time: 2026-01-30T14:23:45

关键实现详细信息

  • 令牌刷新Microsoft.Azure.StackExchangeRedis 库会在令牌过期之前自动刷新令牌,因此无需手动处理刷新。

  • 连接复原能力:StackExchange.Redis 自行管理重新连接逻辑。

  • 资源清理:服务 Redis 实现 IDisposable 在应用程序关闭时正确关闭连接。

  • 日志记录集成:Redis 客户端与 .NET 的 ILoggerFactory 提供统一的日志输出。

Troubleshooting

問题 决议
No connection is available 验证终结点格式和端口(10000)。 确保已预配并可访问 Redis 实例。
AuthenticationFailedException 运行 az login 以刷新凭据。 在“资源”菜单的身份验证下,确认您的身份已被添加为 Redis 用户。
Unauthorized 确保在 Azure 托管 Redis 实例上将 Microsoft Entra ID 标识添加为 Redis 用户。 有关详细信息,请参阅使用 Microsoft Entra ID 进行缓存身份验证