Duende IdentityServer 6.2会话与设备数据未存入数据库的解决问询
一、配置服务器端会话保存到ServerSideSessions表
要让会话持久化到数据库的ServerSideSessions表,需完成以下配置:
启用服务器端会话并绑定EF存储
在ConfigureServices的IdentityServer配置链中添加相关代码,确保会话存储关联到PersistedGrantDbContext:services.AddIdentityServer() // 保留原有配置(如AddConfigurationStore、AddInMemoryClients等) .AddServerSideSessions() .AddServerSideSessionStore<EntityFrameworkServerSideSessionStore>() .AddOperationalStore(options => { options.ConfigureDbContext = b => b.UseSqlServer(/* 你的数据库连接字符串 */); // 可选:开启自动清理过期会话的机制 options.EnableTokenCleanup = true; });EntityFrameworkServerSideSessionStore是Duende官方提供的基于EF的会话存储实现,默认已关联PersistedGrantDbContext,若使用自定义DbContext,需确保包含ServerSideSessions对应的DbSet。更新数据库迁移
ServerSideSessions是新增表,需生成并应用EF迁移以创建表结构:dotnet ef migrations add AddServerSideSessions -c PersistedGrantDbContext dotnet ef database update -c PersistedGrantDbContext客户端会话支持配置
客户端需开启离线访问权限,且请求令牌时携带offline_accessscope,才会触发会话持久化:new Client { // 其他客户端配置 AllowOfflineAccess = true, AllowedScopes = { "openid", "profile", "offline_access" } };
二、配置设备信息存入DeviceCodes关联的Devices表
设备信息存储依赖设备授权流程的正确配置:
确保操作存储已配置
只要已配置AddOperationalStore,Duende会自动处理DeviceCodes和Devices表的存储逻辑,若数据库中无这两张表,需执行迁移命令补全结构。客户端启用设备流
客户端配置需指定设备授权为允许的授权类型:new Client { ClientId = "device_flow_client", ClientName = "设备流客户端", AllowedGrantTypes = GrantTypes.DeviceFlow, ClientSecrets = { new Secret("client_secret".Sha256()) }, AllowedScopes = { "openid", "profile", "api1" }, AllowOfflineAccess = true };使用设备授权流程请求令牌
只有通过设备授权流程(先调用/connect/deviceauthorization获取设备码,再轮询/connect/token)获取令牌时,设备信息才会被写入Devices表并关联到DeviceCodes,其他授权流程不会生成设备记录。
三、关于ISessionManagementService的作用
ISessionManagementService不是用来实现会话持久化的,它是Duende提供的会话管理接口,用于执行以下操作:
- 查询系统内的活跃会话列表
- 根据用户ID、会话ID终止指定会话
- 批量撤销用户的所有会话或关联令牌
当完成会话存储配置后,会话会自动持久化到数据库,此时可注入ISessionManagementService实现会话的后台管理功能(如管理面板的会话终止操作)。
内容的提问来源于stack exchange,提问作者Абай Саякбаев

