Session 管理
TKWF 通过 Session 中间件管理用户会话,自动将认证后的用户绑定到 DomainUser。
Session 中间件
// Program.cs
builder.ConfigWebAppDomain<AppUserInfo, AppDomainInitializer>()
.UseWebSession() // ← 启用 Session 中间件
.Build();
启用后,中间件自动:
- 从 HTTP 请求中提取 Token(Header / Cookie)
- 验证 Token 有效性
- 创建
DomainUser<TUserInfo>并绑定到请求上下文 - 请求结束时清理
Token 传输方式
Header 模式
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Cookie 模式
Cookie: tkws_session=eyJhbGciOiJIUzI1NiIs...
配置方式:
options.Session.TokenSource = TokenSource.BearerHeader; // Header 模式
// 或
options.Session.TokenSource = TokenSource.Cookie; // Cookie 模式
Session 配置
builder.ConfigWebAppDomain<AppUserInfo, AppDomainInitializer>(options =>
{
options.Session = new SessionOptions
{
Expiration = TimeSpan.FromHours(8), // Session 有效期
RefreshOnActivity = true, // 活跃时自动续期
SlidingExpiration = TimeSpan.FromHours(1), // 滑动过期窗口
TokenSource = TokenSource.BearerHeader, // Token 来源
};
});
自定义 Session 存储
默认 Session 存储在内存中。实现 ISessionStore<TUserInfo> 使用自定义存储:
public class RedisSessionStore : ISessionStore<AppUserInfo>
{
public async Task<Session<AppUserInfo>?> GetAsync(string sessionId)
{
// 从 Redis 获取 Session
}
public async Task SaveAsync(Session<AppUserInfo> session)
{
// 保存到 Redis
}
public async Task RemoveAsync(string sessionId)
{
// 从 Redis 删除
}
}
注册:
options.Session.Store = new RedisSessionStore(redisConnection);
Session 状态
┌─────────────┐ ┌──────────────┐ ┌───────────────┐
│ 未认证 │ ──→ │ 已认证 │ ──→ │ Session 过期 │
│ (Anonymous) │ │ (Authenticated) │ │ (Expired) │
└─────────────┘ └──────────────┘ └───────────────┘
│ │ │
│ 登录 │ 访问受保护资源 │ 重新认证
└────────────────────┘ │
│
┌──────────────┐ │
│ 注销 │ ←─────────────────────────┘
│ (LoggedOut) │
└──────────────┘