跳到主要内容
版本:3.0.0

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:ConnectionStringstringRedis 连接串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”。你仍然需要同时接入基础认证和一个具体认证实现。