Redis 用户会话(Aegis.Authorization.RedisUserManager)
当你的认证方案需要把登录态和用户会话放到 Redis,而不是仅保存在单机内存里时,可以接入 Aegis.Authorization.RedisUserManager。它不是独立的认证方案,而是用来替换基础认证默认 IUserManager 的会话扩展组件。
组件概览
| 字段 | 说明 |
|---|---|
| 组件名称 | Redis 用户会话 |
| 真实类库 | Aegis.Authorization.RedisUserManager |
| 父级组件 | Aegis.Core.Authentication |
| 组件定位 | 基于 Redis 实现 IUserManager,用于共享认证会话 |
| 引入方式 | 手动注入 |
| 核心能力 | Redis 持久化用户会话、跨实例共享登录状态 |
| 是否可扩展 | 是 |
| 目标框架 | net8.0 |
| 注册入口 | AddRedisUserManager<T>() |
这个组件本身不参与 Component.deps.json 的自动装配,也不会单独产生认证能力。它只负责把 IUserManager 从默认内存实现切换成 Redis 实现,因此必须和基础认证、以及某个具体认证实现一起使用。
如何引入
NuGet 包
| 角色 | NuGet 包 | 是否必需 | 说明 |
|---|---|---|---|
| 基础认证 | Aegis.Core.Authentication | 是 | 提供认证链路和 IUserManager 抽象 |
| Redis 会话扩展 | Aegis.Authorization.RedisUserManager | 是 | 提供 Redis 版 IUserManager |
| Redis 基础能力 | Aegis.Caching.Redis | 是 | 提供 RedisSourceBase 和 Redis 数据源 |
手动注入
当前组件只能通过代码方式接入:
services.AddRedisSource<AegisRedisSource>(ConfigManager.Get<RedisOptions>("Redis"));
services.AddRedisUserManager<AegisRedisSource>();
要点如下:
- 先注册 Redis 数据源
- 再注册 Redis 用户会话
- 再配合
Authentication + SSO/JWT/ESS等具体认证方案使用
配置说明
这个组件没有自己的独立配置节点,直接复用 Redis 组件的配置即可,例如:
| 节点 | 类型 | 是否必填 | 说明 | 常见取值 / 示例 |
|---|---|---|---|---|
Redis:ConnectionString | string | 是 | Redis 连接串 | 127.0.0.1:6379,defaultDatabase=2 |
快速使用
第一步:注册 Redis 数据源和用户会话
services.AddRedisSource<AegisRedisSource>(ConfigManager.Get<RedisOptions>("Redis"));
services.AddRedisUserManager<AegisRedisSource>();
第二步:继续接入基础认证和一个具体实现
例如:
{
"Components": {
"Services": [
"Authentication",
"JwtAuthorize"
],
"Middlewares": [
"Authentication"
]
}
}
第三步:验证会话是否切到了 Redis
接入成功后,认证组件在登录时写入的用户会话会落到 Redis,而不是只保存在进程内存里。它最适合用来验证这些场景:
- 应用重启后会话仍可恢复
- 多个实例可以共享登录状态
- 认证与业务服务之间可以共用 Redis 会话
具体使用详情
它替换的是谁
基础认证默认会注册 DefaultUserManager。而 Aegis.Authorization.RedisUserManager 的作用,就是把这个默认实现替换成:
RedisUserManager<T>
这样后续的登录、Token 校验和登出,就都改为走 Redis 中的会话数据。
Redis 存储方式
当前实现会把会话写到 Redis Hash 中,键名带有应用名和认证前缀。用户会话的核心内容包括:
- Token
- 用户标识
- 过期时间
- 用户信息对象
适合什么场景
推荐在下面这些场景使用:
- 多实例部署
- 会话不能只保存在单机内存
- 登录态需要跨节点共享
- 应用会频繁重启或滚动发布
如何扩展
使用自定义 Redis 数据源
AddRedisUserManager<T>() 的泛型约束是 T : RedisSourceBase,因此你可以接入自己的 RedisSource 实现,只要它继承自 RedisSourceBase 即可。
如果当前键策略不适合你的业务
当前通用 Redis 用户会话以 Token 作为主键。如果你的场景更适合按用户标识、租户、设备或其他业务维度管理会话,建议自己实现 IUserManager。
常见问题指南
为什么这个组件不能写进 Component.deps.json?
因为它不是 ComponentRegister 组件,而是一个纯服务注册扩展方法。它需要在 Startup / Program 中显式调用。
它和 ESS 包里的 EssRedisUserManager<T> 有什么区别?
两者都用于替换 IUserManager,但键策略不同:
RedisUserManager<T>:更通用,按 Token 管理会话EssRedisUserManager<T>:更贴近 ESS 的登录和登出流程,按用户标识管理会话
如果你用的是 JWT 或其他通用 Token 方案,优先考虑当前组件;如果你用的是 ESS,并且希望会话行为贴近 ESS 实现,优先考虑 EssRedisUserManager<T>。
为什么接了它之后,认证还是没生效?
因为它只负责“会话存哪儿”,不负责“怎么登录、怎么校验 Token”。你仍然需要同时接入基础认证和一个具体认证实现。