此示例演示如何使用 Microsoft Entra ID 身份验证通过 DefaultAzureCredential 流将 ASP.NET Core Web API 连接到 Azure 管理的 Redis。 应用程序避免传统的基于连接字符串的身份验证,转用基于令牌、Microsoft Entra ID 的访问,这符合现代安全最佳实践。
此应用程序是一个最小的 ASP.NET Core 8.0 Web API:
- 在启动时建立与 Azure 托管 Redis 的安全身份验证连接。
- 公开一个简单的 REST 终结点,用于读取和写入缓存中的数据。
- 使用依赖项注入演示正确的 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.Redis 和 Azure.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:从缓存中读取上一次访问时间戳,并使用当前时间更新它
运行应用程序
确保已经过身份验证:
az login在
appsettings.Development.json中更新 Redis 端点。运行应用程序:
dotnet run前往
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 进行缓存身份验证。 |